資料庫自增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