事務失效的幾種原因分析

2022-03-18 16:47:04 字數 1757 閱讀 3332

1、spring的事務註解@transactional只能放在public修飾的方法上才起作用,如果放在其他非public(private,protected)方法上,雖然不報錯,但是事務不起作用

2、如果採用spring+spring mvc,則context:component-scan重複掃瞄問題可能會引起事務失敗。

如果spring和mvc的配置檔案中都掃瞄了service層,那麼事務就會失效。

原因:因為按照spring配置檔案的載入順序來講,先載入springmvc配置檔案,再載入spring配置檔案,我們的事物一般都在srping配置檔案中進行配置,如果此時在載入srpingmvc配置檔案的時候,把servlce也給註冊了,但是此時事物還沒載入,也就導致後面的事物無法成功注入到service中。所以把對service的掃瞄放在spring配置檔案中或是其他配置檔案中。

3、如使用mysql且引擎是myisam,則事務會不起作用,原因是myisam不支援事務,可以改成innodb引擎

4、 @transactional 註解開啟配置,必須放到listener裡載入,如果放到dispatcherservlet的配置裡,事務也是不起作用的。

如果spring和mvc的配置檔案中都掃瞄了service層,那麼事務就會失效。

原因:因為按照spring配置檔案的載入順序來講,先載入springmvc配置檔案,再載入spring配置檔案,我們的事物一般都在srping配置檔案中進行配置,如果此時在載入srpingmvc配置檔案的時候,把servlce也給註冊了,但是此時事物還沒載入,也就導致後面的事物無法成功注入到service中。所以把對service的掃瞄放在spring配置檔案中或是其他配置檔案中。

5、spring團隊建議在具體的類(或類的方法)上使用 @transactional 註解,而不要使用在類所要實現的任何介面上。在介面上使用 @transactional 註解,只能當你設定了基於介面的**時它才生效。因為註解是 不能繼承 的,這就意味著如果正在使用基於類的**時,那麼事務的設定將不能被基於類的**所識別,而且物件也將不會被事務**所包裝。

6、在業務**中如果丟擲runtimeexception異常,事務回滾;但是丟擲exception,事務不回滾;

7、如果在加有事務的方法內,使用了try...catch..語句塊對異常進行了捕獲,而catch語句塊沒有throw  new runtimeexecption異常,事務也不會回滾。

8、在類a裡面有方法a 和方法b, 然後方法b上面用 @transactional加了方法級別的事務,在方法a裡面 呼叫了方法b, 方法b裡面的事務不會生效。原因是在同乙個類之中,方法互相呼叫,切面無效 ,而不僅僅是事務。這裡事務之所以無效,是因為spring的事務是通過aop實現的。

Spring事務失效原因詳解

spring事務依賴的是資料庫的事務,在開發中如果沒有處理好,可能會遇到事務失效的情況,本文就盤點spring事務會失效的一些情況並給出解決方案。spring事務分為宣告式事務和程式設計時事務兩種。看下宣告式事務。使用 transactional做宣告式事務的一些說明 使用 transactiona...

spring事務失效的幾種場景

不廢話 以 mysql 為例,其 myisam 引擎是不支援事務操作的,innodb 才是支援事務的引擎,一般要支援事務都會使用 innodb。根據 mysql 的官方文件 mysql 的官方文件 從 mysql 5.5.5 開始的預設儲存引擎是 innodb,之前預設的都是 myisam,所以這點...

Spring boot事務失效的幾種情況

這幾天在寫專案的時候遇到了spring boot中事務失效的情況,這裡做一下記錄,後面遇到了其他情況再繼續更新。使用乙個沒有事務的方法呼叫乙個有事務的方法,失敗後不會進行回滾 transactional public intupdate admin admin public intinvokeupd...