声明式事务基于注解@Transactional的理解
事務(wù)分為編程式事務(wù) 與 聲明式事務(wù) 這里描述常用的聲明式事務(wù)的原理。
@Transactional?實(shí)現(xiàn)機(jī)制:
當(dāng)在方法上使用@Transactional 時(shí),Spring Framework 默認(rèn)使用 AOP 代理,在代碼運(yùn)行時(shí)生成一個(gè)代理對(duì)象,根據(jù)@Transactional 的屬性配置信息,這個(gè)代理對(duì)象決定該聲明@Transactional 的目標(biāo)方法是否由攔截器 TransactionInterceptor 來(lái)使用攔截,在 TransactionInterceptor 攔截時(shí),會(huì)在在目標(biāo)方法開(kāi)始執(zhí)行之前創(chuàng)建并加入事務(wù),并執(zhí)行目標(biāo)方法的邏輯, 最后根據(jù)執(zhí)行情況是否出現(xiàn)異常決定提交或回滾事務(wù)。
@Transactional 中相關(guān)參數(shù)說(shuō)
name? ? ? :當(dāng)在配置文件中有多個(gè) TransactionManager , 可以用該屬性指定選擇哪個(gè)事務(wù)管理器。
propagation :事務(wù)的傳播行為,默認(rèn)值為 REQUIRED。
isolation? ? ?:事務(wù)的隔離度,默認(rèn)值采用 DEFAULT。
timeout? ? ? ? ? ? ?:事務(wù)的超時(shí)時(shí)間,默認(rèn)值為-1。如果超過(guò)該時(shí)間限制但事務(wù)還沒(méi)有完成,則自動(dòng)回滾事務(wù)。
read-only? :指定事務(wù)是否為只讀事務(wù),默認(rèn)false 為了忽略那些不需要事務(wù)的方法,如讀取數(shù)據(jù)可以設(shè)置read-only為true。
rollback-for? ? ? :用于指定能夠觸發(fā)事務(wù)回滾的異常類型,如果有多個(gè)異常類型需要指定,各類型之間可以通過(guò)逗號(hào)分隔。
no-rollback- for:拋出 no-rollback-for 指定的異常類型,不回滾事務(wù)。
(重點(diǎn)說(shuō)明)propagation : 事務(wù)的傳播行為?
Propagation.REQUIRED(默認(rèn)):如果當(dāng)前存在事務(wù),則加入該事務(wù),如果當(dāng)前不存在事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。
Propagation.SUPPORTS:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。
Propagation.MANDATORY:如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前不存在事務(wù),則拋出異常。
Propagation.REQUIRES_NEW:重新創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),暫停當(dāng)前的事務(wù)。
Propagation.NOT_SUPPORTED:以非事務(wù)的方式運(yùn)行,如果當(dāng)前存在事務(wù),暫停當(dāng)前的事務(wù)。
Propagation.NEVER:以非事務(wù)的方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。
Propagation.NESTED: Propagation.REQUIRED 效果一樣。
?
不會(huì)執(zhí)行事務(wù)的場(chǎng)景:懂原理才能知道為什么不執(zhí)行!!
為什么不啟用事務(wù)的排查邏輯:
1、public:SpringAOP中涉及的核心類CglibAopProxy 或者 JdkDynamicAopProxy 無(wú)法獲取@Transactional 的相關(guān)配置,底層使用反射讀取配置信息,但該方法非Public 所以獲取不到。
2、try/catch:核心類找到了你@Transactional 的配置,但你在方法里catch 掉了,所以事務(wù)攔截器攔截的時(shí)候抓不到異常導(dǎo)致無(wú)法回滾
3、同類中自調(diào)用:找到了,也沒(méi)有catch.但還是沒(méi)有回滾,看看是不是在同一個(gè)類中形成了自調(diào)用(同類中方法事務(wù)A調(diào)用事務(wù)方法B)這里可以參考IBM的這個(gè)博客
4、propagation:找到?jīng)]也沒(méi)catch也無(wú)自調(diào)用,檢查Propagation 參數(shù)是否配置了不啟用事務(wù)的參數(shù)
5、回滾異常檢測(cè):檢查rollbackFor 以及?noRollbackFor 這里檢查的異常是否有問(wèn)題。
?
?
參考文章:
https://blog.csdn.net/nextyu/article/details/78669997? 《Spring Boot 中使用 @Transactional 注解配置事務(wù)管理》
https://www.ibm.com/developerworks/cn/java/j-master-spring-transactional-use/index.html?《透徹的掌握 Spring 中@transactional 的使用》
https://docs.spring.io/spring/docs/4.3.13.RELEASE/spring-framework-reference/htmlsingle/#transaction-declarative-annotations
《Spring框架參考文檔》
轉(zhuǎn)載于:https://www.cnblogs.com/lanSeGeDiao/p/10919415.html
總結(jié)
以上是生活随笔為你收集整理的声明式事务基于注解@Transactional的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 恋与制作人羁绊进化
- 下一篇: RabbitMQ学习之Routing(4