天天看點

spring事務-傳播級别

資料庫自增id在這時候會跳躍,因為一個事務占了兩個id,有一個會退掉了。

事務的傳播級别是指目前的事務對于外層事務的關系。

1.REQUIRED

内外為同一個事務,且内層抛出異常後,内層先復原并把事務設定為rollback-only,外層是在commit時候發現是rollback-only的,是以復原并抛出UnexpectedRollbackException異常;

外層異常後,會把内外的操作同時復原。

@Service
public class Inner {
    @Autowired
    AffiarMapper affiarMapper;

    @Transactional(propagation = Propagation.REQUIRED)
    public void test() {
        Affiar affiar = new Affiar();
        affiar.setName("hyq1");
        affiarMapper.insert(affiar);
        throw new RuntimeException("inner ex");
    }

}
@Service
public class Outter {

    @Autowired
    Inner inner;
    @Autowired
    AffiarMapper affiarMapper;

    @Transactional(propagation = Propagation.REQUIRED)
    public void test() {
        Affiar affiar = new Affiar();
        affiar.setName("hyq");
        affiarMapper.insert(affiar);
        try {
            inner.test();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
           

2.REQUIRES_NEW

聲明 REQUIRES_NEW 的話就會建立一個新的實體事務,内層事務的送出復原都是獨立于外層事務的。外層事務不受内層事務結果的影響,他們運作于獨立的實體事務。

外層的復原也不影響内層的操作。

如果兩個事務有鎖競争會形成死鎖,比如内外層都要更新同一條記錄,因為外層的事務要等内部的事務結束一起送出,但是内部的事務又要等外部的事務釋放鎖(REQUIRED不會,因為他們是一個事務)。

3. NESTED

NESTED 使嵌套的事務使用相同的實體事務,但是對嵌套調用設定了儲存點,是以 inner 事務可以獨立于 outer 事務復原。

如果沒有活動事務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。

4. SUPPORTS

支援事務,如果目前存在事務,就沿用目前事務,如果不存在,則繼續采用無事務的方式運作。

5. MANDATORY

必須使用事務。如果目前沒有事務,則會抛出異常,如果存在目前事務,就沿用目前事務。(如果不存在事務,抛出異常不影響外部邏輯)

6. NOT_SUPPORTED

不支援事務,目前存在事務時,将挂起事務(外層挂起),運作目前方法(内層方法)。

7. NEVER

不支援事務,如果目前方法存在事務,則抛出異常-Existing transaction found for transaction marked with propagation ‘never’,否則繼續使用無事務機制運作。

https://www.jianshu.com/p/ab6195310548