Spring boot 事務問題

Spring boot 的事務

Spring boot 的事務一直表現一些奇怪的特點,現在一一列舉一下,留作參照。

事務 @Transactional 註解不生效

事務不生效的原因有很多,其他的都可以理解,但有一個確實不可理喻。當 @Service 第一個方法沒有使用 @Transactional 註解時,後續調用的方法即使使用 @Transactional 註解。事務也不會開啓。

在同一個 @Service 註解類下的不同 @Transactional 不能同時生效

這是spring 事務的奇怪特性。比如我要在 catch 裏執行一些事務方法(關閉訂單等。),我需要使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 開啓一個獨立事務,避免被主事務回滾。然而,不行!至少你不能寫在同一個 Class 類裏。你必須在另一個 Class 裏的方法加入 @Transactional(propagation = Propagation.REQUIRES_NEW) 才能生效。
原因:同一個類的的方法調用不是使用spring的代理調用,而是類似於 this.xxx, 這個是類方法本身的調用無法使用事務aop

不同 @Service 註解的類的 @Transactional 生效區別

1,主類沒有事務註解,被調用類有事務註解,事務生效。
2,主類有事務註解,被調用類有事務註解,事務生效。

結論

1,避免在需要開啓事務的方法被不需要開啓事務的同一個類的方法所調用,否則事務無效。
2,避免需要開啓新事務的方法被同一個類的方法所調用,否則事務無效。
總結來說,避免非spring代理方法調用,否則無法開始spring aop事務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章