Spring事務傳播特性
阿新 • • 發佈:2022-03-01
場景:假設有這樣一段程式碼,兩個方法都有事務,a()方法呼叫b()方法。
注意:如果兩個有事務的方法在同一個bean裡面,不能直接用 this.b();
去呼叫b方法,否則會失效,因為Spring事務是基於AOP的動態代理實現的,要想讓事務正常執行,需要用代理物件去呼叫b方法,而不能用真實物件去執行,而這裡的 this 就是真實物件。
@Service public class Demo { @Transactional public void a() { System.out.println("AAAAAAAA.."); // 注意這裡不能用 this.b(); 去呼叫b方法,否則b方法的事務會失效 Demo demo = (Demo) AopContext.currentProxy(); demo.b(); } @Transactional public void b() { System.out.println("BBBBBBBB.."); } }
-
required
如果a方法有事務,那b就用a的事務,如果a沒有,那b就建立一個事務 -
supports
支援事務,如果當前有事務則加入到這個事務,沒有則以非事務的方式執行
假設b方法是supports,如果a方法有事務,則加入到a方法的事務,如果a沒有事務,則b就相當於一個普通方法(沒有事務的方法)
-
mandatory
支援當前事務,如果不存在事務則丟擲異常
假設b是mandatory,如果a方法沒有事務,b就會丟擲異常
-
requires_new
開啟一個新事物,如果當前有事務則掛起
不管a方法有沒有事務,b方法都要新建一個事務,兩個事務相互獨立,如果b出現異常,回滾事務,但是不影響a事務
-
not_supported
不支援事務,總是以非事務的方式執行
a有事務,b是not_supported,b總以非事務的方式執行
-
never
不支援事務,如果當前有事務就直接丟擲異常
a有事務,b的事務是never,如果a呼叫b,則b會丟擲異常
-
nested
如果當前事務存在,則在巢狀事務中執行,否則類似於required
本文來自部落格園,作者:祖國滴粑粑花,轉載請註明原文連結:https://www.cnblogs.com/rxx1005/p/15948141.html