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事務。