日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

声明式事务基于注解@Transactional的理解

發(fā)布時(shí)間:2023/12/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 声明式事务基于注解@Transactional的理解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

事務(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。