一、介紹
- Spring事務(wù)的本質(zhì),其實(shí)就是通過 Spring AOP 切面技術(shù)
- Spring事務(wù)支持2種使用方式
- 聲明式事務(wù)(注解方式)
- 編程式事務(wù)(代碼方式):代碼需要手動控制,比較繁瑣,一般不使用
二、開啟事務(wù)
-
SpringBoot文章來源:http://www.zghlxwxcb.cn/news/detail-833930.html
- 默認(rèn)開啟了事務(wù)
-
Spring文章來源地址http://www.zghlxwxcb.cn/news/detail-833930.html
<!-- 事務(wù)管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 注解驅(qū)動,值為事務(wù)管理器的id --> <tx:annotation-driven transaction-manager="transactionManager"/>
三、聲明式事務(wù)(@Transactional)
1、原理
- Spring的事務(wù)是使用AOP來實(shí)現(xiàn)的,在執(zhí)行目標(biāo)方法的前和后,加上了事務(wù)管理的代碼,在目標(biāo)方法執(zhí)行成功后,提交事務(wù),拋出異常,則回滾事務(wù)
2、注解標(biāo)注的位置
- 接口上:不推薦。Spring事務(wù)是通過AOP來實(shí)現(xiàn)的,而AOP是基于動態(tài)代理實(shí)現(xiàn)的,AOP的動態(tài)代理有2種方式,如果配置了 AOP為cglib(基于類),將會導(dǎo)致該注解失效
- 類上:該類所有的public方法都配置相同的事務(wù)屬性
- 方法上:當(dāng)類上標(biāo)注了,方法上也標(biāo)注了,方法上標(biāo)注的優(yōu)先級更高
3、事務(wù)的條件
- 含有注解的類必須被Spring管理,加載到IOC容器中
- 方法必須是public,沒有權(quán)限訪問則無法進(jìn)行事務(wù)管理
- 如果視為操作錯誤,必須拋出異常,默認(rèn)只有拋出RuntimeException 或者 Error才會回滾
4、事務(wù)生效、不生效的場景
- 數(shù)據(jù)庫表的引擎不是innodb。不生效
- 含有注解的類沒有加載到IOC容器中。不生效
- 注解標(biāo)注在非public的方法上。不生效
- 拋出的異常不是指定的回滾異常類型
rollbackFor
、rollbackForClassName
、noRollbackFor
、noRollbackForClassName
。不生效 - 拋出的異常被catch了。不生效
- methodA調(diào)用methodB,2個方法在同1個類
- methodA上不加注解,methodB上加注解。methodB的事務(wù)不生效
- methodA上加注解,methodB加不加注解,事務(wù)都是有效的。則AB在同一事務(wù)中
- methodA調(diào)用methodB,2個方法在不同的類
- methodA加注解,methodB加不加注解,事務(wù)都是有效的
- methodA不加注解,methodB加注解,只有B是有事務(wù)的
5、@Transactional屬性
1、value、transactionManager
- 指定事務(wù)管理器
- 一個工程可能訪問多個數(shù)據(jù)源,可能會配置多個事務(wù)管理器
2、propagation
- 事務(wù)的傳播行為(7種)
//如果當(dāng)前存在事務(wù)則加入事務(wù);如果當(dāng)前不存在事務(wù),則創(chuàng)建一個新的事務(wù)。默認(rèn)
Propagation.REQUIRED
//如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行
Propagation.SUPPORTS
//如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則拋出異常
//與Propagation.NEVER相反
Propagation.MANDATORY
//不管是否存在事務(wù),都創(chuàng)建一個新的事務(wù),原來的掛起,新的執(zhí)行完畢,繼續(xù)執(zhí)行老的
Propagation.REQUIRES_NEW
//以非事務(wù)的方式執(zhí)行,如果當(dāng)前存在事務(wù),則將其掛起
Propagation.NOT_SUPPORTED
//以非事務(wù)的方式運(yùn)行;如果當(dāng)前存在事務(wù),則拋出異常
//與Propagation.MANDATORY相反
Propagation.NEVER
//如果當(dāng)前存在事務(wù),則在該事務(wù)內(nèi)嵌套事務(wù)運(yùn)行;如果當(dāng)前不存在事務(wù),則創(chuàng)建一個新的事務(wù)
Propagation.NESTED
3、isolation
- 事務(wù)隔離級別
//。默認(rèn)
Isolation.DEFAULT
//讀取未提交數(shù)據(jù),可能會出現(xiàn)臟讀、不可重復(fù)讀、幻讀
Isolation.READ_UNCOMMITTED
//讀取已提交數(shù)據(jù),可能會出現(xiàn)不可重復(fù)讀、幻讀
Isolation.READ_COMMITTED
//可重復(fù)讀,可能會出現(xiàn)幻讀
Isolation.REPEATABLE_READ
//串行化讀取,事務(wù)只能依次執(zhí)行,避免了臟讀、不可重復(fù)讀、幻讀。執(zhí)行效率低
Isolation.SERIALIZABLE
4、timeout
- 事務(wù)超時
- 單位s,默認(rèn)-1
- 是指一個事務(wù)所允許執(zhí)行的最長時間,如果超過該時間限制但事務(wù)還沒有完成,則自動回滾事務(wù),并拋出TransactionTimedOutException異常,阻止可能出現(xiàn)的長時間的阻塞系統(tǒng)或者占用系統(tǒng)資源
5、readOnly
- 是否只讀
- true-只讀,如果方法內(nèi)存在增、刪、改則會拋出異常;false-讀寫,增、刪、改、查操作都允許。默認(rèn)false
6、rollbackFor
- 回滾的異常類型
- 異常類的class數(shù)組,
Class<? extends Throwable>[]
7、rollbackForClassName
- 不會回滾的異常類型
- 異常類名的String數(shù)組,String[]
8、noRollbackFor
- 不會回滾的異常類型
- 異常類的class數(shù)組,
Class<? extends Throwable>[]
9、noRollbackForClassName
- 不會回滾的異常類型
- 異常類名的String數(shù)組,String[]
到了這里,關(guān)于Spring的事務(wù)(@Transactional)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!