導致Spring事務失效,常見的情況有哪些

2021-10-13 13:05:01 字數 2335 閱讀 8488

未啟用spring事務管理功能

方法不是public型別的

資料來源未配置事務管理器

自身呼叫問題

異常型別錯誤

異常被吞了

業務和spring事務**必須在乙個執行緒中

1.1、未啟用spring事務管理功能

@enabletransactionmanagement 註解用來啟用spring事務自動管理事務的功能,這個註解千萬不要忘記寫了。

1.2、方法不是public型別的

@transaction 可以用在類上、介面上、public方法上,如果將@trasaction用在了非public方法上,事務將無效。

1.3、資料來源未配置事務管理器

spring是通過事務管理器了來管理事務的,一定不要忘記配置事務管理器了,要注意為每個資料來源配置乙個事務管理器:

@bean

public

platformtransactionmanager

transactionmanager

(datasource datasource)

1.4、自身呼叫問題

spring是通過aop的方式,對需要spring管理事務的bean生成了**物件,然後通過**物件攔截了目標方法的執行,在方法前後新增了事務的功能,所以必須通過**物件呼叫目標方法的時候,事務才會起效。

@component

public

class

userservice

@transactional

public

voidm2(

)}

顯然不會生效,因為m1中通過this的方式呼叫了m2方法,而this並不是**物件,this.m2()不會被事務***,所以事務是無效的,如果外部直接呼叫通過userservice這個bean來呼叫m2方法,事務是有效的,上面**可以做一下調整,如下,@1在userservice中注入了自己,此時m1中的m2事務是生效的

@component

public

class

userservice

@transactional

public

voidm2(

)}

重點:必須通過**物件訪問方法,事務才會生效。

1.5、異常型別錯誤

spring事務回滾的機制:對業務方法進行try catch,當捕獲到有指定的異常時,spring自動對事務進行回滾,那麼問題來了,哪些異常spring會回滾事務呢?

並不是任何異常情況下,spring都會回滾事務,預設情況下,runtimeexception和error的情況下,spring事務才會回滾。

也可以自定義回滾的異常型別:

@transactional

(rollbackfor =

)

1.6、異常被吞了

當業務方法丟擲異常,spring感知到異常的時候,才會做事務回滾的操作,若方法內部將異常給吞了,那麼事務無法感知到異常了,事務就不會回滾了。

如下**,事務操作2發生了異常,但是**獲了,此時事務並不會被回滾

@transactional

public

voidm1(

)catch

(exception e)

}

1.7、業務和spring事務**必須在乙個執行緒中

spring事務實現中使用了threadlocal,threadlocal大家應該知道吧,可以實現同乙個執行緒中資料共享,必須是同乙個執行緒的時候,資料才可以共享,這就要求業務**必須和spring事務的原始碼執行過程必須在乙個執行緒中,才會受spring事務的控制,比如下面**,方法內部的子執行緒內部執行的事務操作將不受m1方法上spring事務的控制,這個大家一定要注意

@transactional

public

voidm1(

).start()

;}

2種方式

方式1:看日誌

如果你使用了logback或者log4j來輸出日誌,可以修改一下日誌級別為debug模式,可以看到事務的詳細執行日誌,幫助你定位錯誤

方式2:除錯**

如果你對原始碼比較了解,那麼你會知道被spring管理事務的業務方法,執行的時候都會被transactioninterceptor***攔截,會進入到它的invoke方法中,咱們可以在invoke方法中設定一些斷點,可以看到詳細的執行過程,排錯也就比較容易了。

整體上來說,還是需要你深入理解原理,原理了解了,寫**的時候本身就會避免很多坑。

spring事務失效

遇到的問題 前端時間我在做乙個父子事務巢狀的時候,出現了子事務失效。在同類的子事務上加事務註解一直都不能建立事務,後來發現是子事務失效了。下面總結一下事務失效情況和解決經驗 事務失效有如下幾種情況 沒有transaction註解 事務沒有丟擲runtimeexception異常到方法上 方法內丟擲r...

Spring 事務失效

1.丟擲檢查異常導致事務不能正確回滾 service public class service1 2.業務方法內自己 try catch 異常導致事務不能正確回滾 service public class service2 catch filenotfoundexception e 解法2 手動設定...

spring配置錯誤重複掃瞄導致事務失效的問題解決

事情的起因是,除錯過程中,發現有一處事務不起效。後來發現是spring配置檔案被改動。於是對各個spring配置檔案進行了分析。在這裡先給出四個配置檔案的部分內容,著重關注標紅的部分 省略 class org.springframework.beans.factory.config.property...