關(guān)于spring事務(wù)傳播行為非事務(wù)方式的理解
spring事務(wù)傳播行為非事務(wù)方式
具體的隔離級別可以看看搜一下,相關(guān)的博客挺多的,現(xiàn)在說一下對傳播行為 PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER中很多解釋為 非事務(wù)方式運(yùn)行 的理解。 ??
關(guān)于什么是‘非事務(wù)方式運(yùn)行‘問了些人,也看了spring相關(guān)解釋,都沒能解釋的讓人很明白。從字面上解釋就是不在事務(wù)中運(yùn)行,這種理解是不對的。在innodb這種支持事務(wù)的存儲引擎中,所有的操作都是在事務(wù)中完成的。
下面截圖是默認(rèn)隔離級別(PROPAGATION_REQUIRED)下數(shù)據(jù)庫操作的截圖,在進(jìn)行插入之前都會設(shè)置為非自動提交。
??
下圖是never隔離級別下的數(shù)據(jù)庫操作截圖,可以看到在操作數(shù)據(jù)庫之前設(shè)置為自動提交了。
??
demo代碼如下,ps:傳播行為、隔離級別生效 要在不同的類中調(diào)用(動態(tài)代理支持)
??
小結(jié)一下:非事務(wù)的方式運(yùn)行,其實就是設(shè)置為自動提交了,如果一個方法中有多個操作,則每個操作都會在不同事務(wù)中完成,不會保證他們的原子性。個人理解,有啥不對 歡迎指正。
Spring事務(wù)理解和配置
1 Spring事務(wù)
1.1 事務(wù)簡介
1.1.1 什么是事務(wù)
- 事務(wù):邏輯上的一組操作,組成這組操作的各個單元,要么全部成功,要么全部失敗.
1.1.2 事物的特性
- 原子性:事務(wù)不可分割
- 一致性:事務(wù)執(zhí)行前后數(shù)據(jù)完整性保持一致
- 隔離性:一個事務(wù)的執(zhí)行不應(yīng)該受到其他事物的影響
- 持久性:一旦事務(wù)結(jié)束,數(shù)據(jù)就持久化到數(shù)據(jù)庫
1.1.3 不考慮事物會引發(fā)的安全問題
- 讀問題
臟讀:一個事務(wù)讀到另一個事務(wù)未提交的數(shù)據(jù)
不可重復(fù)度:一個事務(wù)讀到另一個事務(wù)已經(jīng)提交的update的數(shù)據(jù),導(dǎo)致一個事務(wù)中多次查詢結(jié)果不一致.
幻讀:一個事務(wù)讀到另一個事務(wù)已經(jīng)提交的insert的數(shù)據(jù),導(dǎo)致一個事務(wù)中多次查詢結(jié)果不一致
- 寫問題
丟失更新
1.1.4 事務(wù)隔離級別
Read uncommitted:讀未提交,任何問題解決不了Read committed:讀已提交,解決臟讀,但是不可重復(fù)度和幻讀有可能發(fā)生(Oracle默認(rèn))Repeatable read:重復(fù)度,解決臟讀和不可重復(fù)讀,但是幻讀可能發(fā)生(msyql默認(rèn))Serializable:序列化,解決所有讀問題
1.2 事務(wù)的傳播行為
Spring中提供了七種事務(wù)的傳播行為:
保證多個操作在同一個事務(wù)中
PROPAGATION_REQUIRED:默認(rèn)值,如果A中有事務(wù),使用A中的事務(wù),如果A沒有,創(chuàng)建一個新的事務(wù),將操作包含進(jìn)來PROPAGATION_SUPPORTS:支持事務(wù),如果A中有事務(wù),使用A中的事務(wù)。如果A沒有事務(wù),不使用事務(wù)。PROPAGATION_MANDATORY:如果A中有事務(wù),使用A中的事務(wù)。如果A沒有事務(wù),拋出異常。
保證多個操作不在同一個事務(wù)中
PROPAGATION_REQUIRES_NEW:如果A中有事務(wù),將A的事務(wù)掛起(暫停),創(chuàng)建新事務(wù),只包含自身操作。如果A中沒有事務(wù),創(chuàng)建一個新事務(wù),包含自身操作。PROPAGATION_NOT_SUPPORTED:如果A中有事務(wù),將A的事務(wù)掛起。不使用事務(wù)管理。PROPAGATION_NEVER:如果A中有事務(wù),報異常。
嵌套式事務(wù)
PROPAGATION_NESTED:嵌套事務(wù),如果A中有事務(wù),按照A的事務(wù)執(zhí)行,執(zhí)行完成后,設(shè)置一個保存點(diǎn),執(zhí)行B中的操作,如果沒有異常,執(zhí)行通過,如果有異常,可以選擇回滾到最初始位置,也可以回滾到保存點(diǎn)。
1.3 編程式事務(wù)(需要手動寫代碼,了解)
1.3.1 配置平臺事務(wù)管理器
<!-- 配置平臺事務(wù)管理器============================= --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
1.3.2 Spring提供了事務(wù)管理的模板類
<!-- 配置事務(wù)管理的模板 --> <bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/> </bean>
1.3.3 在業(yè)務(wù)層注入事務(wù)管理的模板
<!-- 配置Service============= --> <bean id="accountService" class="com.itheima.tx.demo1.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> <!-- 注入 事務(wù)管理的模板 --> <property name="trsactionTemplate" ref="transactionTemplate"/> </bean>
1.3.4 編寫事務(wù)管理的代碼
public void transfer(final String from, final String to, final Double money) {
trsactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
accountDao.outMoney(from, money);
int d = 1/0;
accountDao.inMoney(to, money);
}
});
1.4 聲明式事務(wù)(xml配置)
1.4.1 配置事務(wù)管理器
<!-- 配置事務(wù)管理器=============================== --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
1.4.2 配置增強(qiáng)
<!-- 配置事務(wù)的增強(qiáng)=============================== --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 事務(wù)管理的規(guī)則 --> <!-- <tx:method name="save*" propagation="REQUIRED" isolation="DEFAULT"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="find*" read-only="true"/> --> <tx:method name="*" propagation="REQUIRED" read-only="false"/> </tx:attributes> </tx:advice>
1.4.3 AOP的配置
<!-- aop的配置 --> <aop:config> <aop:pointcut expression="execution(* com.itheima.tx.demo2.AccountServiceImpl.*(..))" id="pointcut1"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config>
1.5 聲明式事務(wù)(注解)
1.5.1 配置事務(wù)管理器
<!-- 配置事務(wù)管理器=============================== --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
1.5.2 開啟注解事務(wù)
<!-- 開啟注解事務(wù)================================ --> <tx:annotation-driven transaction-manager="transactionManager"/>
1.5.3 在業(yè)務(wù)層添加注解
@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
public class AccountServiceImpl implements AccountService {
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
MybatisPlusInterceptor實現(xiàn)sql攔截器超詳細(xì)教程
這篇文章主要給大家介紹了關(guān)于MybatisPlusInterceptor實現(xiàn)sql攔截器超詳細(xì)教程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
Java多線程程序中synchronized修飾方法的使用實例
synchronized關(guān)鍵字主要北用來進(jìn)行線程同步,這里我們主要來演示Java多線程程序中synchronized修飾方法的使用實例,需要的朋友可以參考下:2016-06-06
idea已經(jīng)提交到遠(yuǎn)程分支,但需要本地和遠(yuǎn)程都回退到某一版本問題
這篇文章主要介紹了idea已經(jīng)提交到遠(yuǎn)程分支,但需要本地和遠(yuǎn)程都回退到某一版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
Sharding-jdbc報錯:Missing the data source
在使用MyBatis-plus進(jìn)行數(shù)據(jù)操作時,新增Order實體屬性后,出現(xiàn)了數(shù)據(jù)源缺失的提示錯誤,原因是因為userId屬性值使用了隨機(jī)函數(shù)生成的Long值,這與sharding-jdbc的路由規(guī)則計算不匹配,導(dǎo)致無法找到正確的數(shù)據(jù)源,通過調(diào)整userId生成邏輯2024-11-11
SpringBoot集成ShedLock實現(xiàn)分布式定時任務(wù)
ShedLock 是一個 Java 庫,通常用于分布式系統(tǒng)中,確保定時任務(wù)(Scheduled Tasks)在集群環(huán)境下只被某一個實例執(zhí)行一次,它通過在共享資源中添加鎖的方式,本文給大家介紹了SpringBoot集成ShedLock實現(xiàn)分布式定時任務(wù),需要的朋友可以參考下2024-11-11
Java數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹詳解
二叉搜索樹作為一個經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點(diǎn),同時查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹的原理與實現(xiàn),需要的可以參考一下2022-06-06

