1. 程式人生 > >分散式事務(二)Spring事務傳播行為

分散式事務(二)Spring事務傳播行為

public class ServiceA {
       @Autowired
       private ServiceB b;

       @Transactional
       public void method() {
           // 資料庫操作
            b.methodB();
       }
}

public class ServiceB {

       @Transactional
       public void method() throws Exception { 
           //資料庫操作 
       }
}

**PROPAGATION_REQUIRED:**預設,如果ServiceA.method呼叫了ServiceB.method,如果ServiceA.method開啟了事務,然後ServiceB.method也聲明瞭事務,那麼ServiceB.method不會開啟獨立事務,而是將自己的操作放在ServiceA.method的事務中來執行,ServiceA和ServiceB任何一個報錯都會導致整個事務回滾。

**PROPAGATION_SUPPORTS:**如果ServiceA.method開了事務,那麼ServiceB就將自己加入ServiceA中來執行,如果ServiceA.method沒有開事務,那麼ServiceB自己也不開事務。

**PROPAGATION_MANDATORY:**必須被一個開啟了事務的方法來呼叫自己,否則報錯。

**PROPAGATION_REQUIRES_NEW:**ServiceB.method強制性自己開啟一個新的事務,然後ServiceA.method的事務會卡住,等ServiceB事務完了自己再繼續。這就是影響的回滾了,如果ServiceA報錯了,ServiceB是不會受到影響的,ServiceB報錯了,ServiceA也可以選擇性的回滾或者是提交。

**PROPAGATION_NOT_SUPPORTED:**就是ServiceB.method不支援事務,ServiceA的事務執行到ServiceB那兒,就掛起來了,ServiceB用非事務方式執行結束,ServiceA事務再繼續執行。這個好處就是ServiceB程式碼報錯不會讓ServiceA回滾。

**PROPAGATION_NEVER:**不能被一個事務來呼叫,ServiceA.method開事務了,但是呼叫了ServiceB會報錯

**PROPAGATION_NESTED:**開啟巢狀事務,ServiceB開啟一個子事務,如果回滾的話,那麼ServiceB就回滾到開啟子事務的這個save point。