2017-02-21 161 views
0
@Service 
public Class Demo(){ 

    @Transactional(rollbackFor=CustomException.class) 
    @Override 
    public RetunType methodONE()throws Exception{ 
     methodTWO(); 
     methodFIVE(); 
    } 

    @Transactional 
    @Override 
    public RetunType methodTWO()throws Exception{ 
      methodFOUR(); 
      methodTHREE(); 
      throws new CustomException("error_msg"); 
     } 

    @Transactional(propagation=Propagation.REQUIRES_NEW) 
    @Override 
    public RetunType methodTHREE(){ 
     . 
     .. 
     . 
     .. 
     . 
    } 
} 

public Class CustomException extends Exception{ 

    public CustomException(String msg){ 
     super(msg) 
    } 
} 

我不想只回滾我的methodThree交易。現在它將回滾方法TWO/THREE/FOUR/FIVE中所做的所有更改。我無法進一步瞭解。春季交易傳播和回滾行爲

我想在所有其他方法和methodThree()中做交易相關的代碼它只是在數據庫中的狀態更新。

回答

0

如果我明白你想要做什麼,這裏有methodTHREE在它自己的事務內部嵌套在父事務中,你的問題可能是這些方法在同一個類中。

這很重要,因爲Spring應用AOP的方式,在這種情況下,通過應用事務邏輯,使用代理攔截方法調用。問題是方法調用是內部的或者是自我調用的,所以永遠不會通過代理。這意味着不會爲MethodThree()創建新的事務。

你有兩個選擇:

  1. Move方法三到一個單獨的類。

  2. 將模式從代理更改爲AspectJ,它將事務邏輯編入類本身。

Spring Doc for @Transactional

+0

**與選項1成功獲得我的嵌套事務結果** –

+0

好,我想這可能。如果它能幫助解決您的問題,請將我的答案標記爲已接受。謝謝。 – AlyoshaKaramazov