Spring的五種事務隔離級別
- 默認:默認使用數據庫的隔離級別
- 讀未提交
- 讀提交
- 可重複讀
- 串行化
Spring的七種事務傳播行爲
1. propagation_required:
表示當前方法必須運行在事務中。如果當前事務存在,方法將會在該事務中運行。 否則會啓動一個新的事務。
2. propagation_supports:
表示當前方法不需要上下文,如果事務存在當前事務的話,那麼該方法會在這個事務中執行。
也就是說:如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執行。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
methodB();
// do something
}
// 事務屬性爲SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void methodB() {
// do something
}
- 當單獨調用methodB時,methodB方法是非事務的執行的。
- 當調用methdA時,methodB則加入了methodA的事務中,事務地執行。
3. propagation_mandatory:
如果已經存在一個事務,則支持當前事務。如果沒有一個活動的事務,就拋出異常。
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
methodB();
// do something
}
// 事務屬性爲MANDATORY
@Transactional(propagation = Propagation.MANDATORY)
public void methodB() {
// do something
}
-
當單獨調用methodB時,因爲當前沒有一個活動的事務,則會拋出異常throw new IllegalTransactionStateException(“Transaction propagation ‘mandatory’ but no existing transaction found”);
-
當調用methodA時,methodB則加入到methodA的事務中,事務地執行。
4. propagation_requires_new
如果當前方法在一個事務中,那麼創建一個新的事務,與外層事務無關 ( 外層事務回滾也不會回滾這個事務 ), 例如,上面單獨執行的方法B,就單獨創建了一個新事務,和調用者事務A無關
5. propagation_not_supported
在一段事務中,如果某一個函數不希望其支持事務的話,那麼就給這個函數使用propagation_not_supported就ok了。
6. PROPAGATION_NEVER
總是非事務地執行,如果存在一個活動事務,則拋出異常
7. PROPAGATION_NESTED
如果沒有活動事務, 則獨創一個事務執行。
如果在一個活動事務裏的話,其實和propagation.required_new類似都是創建一個新的事務,但有些區別就是:
required_new 不存在嵌套關係,即外層事務的回滾不會對內層事務回滾!
而使用propagation_nested時,外層事務的回滾可以引起內層事務的回滾。(但內層事務的異常並不會導致外層事務的回滾,它是一個真正的內部嵌套的事務)。