事務的傳播特性與理解
事務的傳播在Spring註解中使用@Transactional(propagation=Propagation.REQUIRED)
來配置。
事務的傳播類型
1. REQUIRED 默認值
如果已經存在事務,則加入此事務中執行;如果不存在事務,則新建事務執行。
一般使用此模式就能滿足絕大多數業務邏輯。
2. SUPPORTS
如果當前存在事務,則加入此事務中執行;如果當前不存在事務,則以非事務方式執行。
3. NOT_SUPPORTED
始終以非事務方式執行;如果當前存在事務,則掛起事務。
4. REQUIRES_NEW
始終在新事務中執行;如果當前存在事務,則新建事務執行。
5. NEVER
以非事務方式執行;如果當前存在事務,則拋出異常。
6. MANDATORY
始終以事務方式執行;如果當前不存在事務,則拋出異常。
事務傳播特性示例中理解
1. 使用NOT_SUPPORTED
如果我們在一個事務方法中需要記錄操作日誌,這個時候我們就可以把日誌記錄方法設置爲NOT_SUPPORTED
。
@Transactional(propagation=Propagation.NOT_SUPPORTED)
public void saveLog() {
// ...
}
@Transactional(propagation=Propagation.REQUIRED)
public void dealTransactional() {
saveLog();
// xxx
}
2. 使用REQUIRES_NEW
如果我們在一個事務方法中需要執行另一個事務方法,並且不想另一個事務方法導致的回滾影響本事務方法,這個時候就適合使用REQUIRES_NEW
。
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void otherTransactional() {
// ...
}
@Transactional(propagation=Propagation.REQUIRED)
public void dealTransactional() {
// xxx
otherTransactional();
}