Spring在TransactionDefinition接口中規定了7種類型的事務傳播行爲,
它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:
事務傳播行爲類型
事務傳播行爲類型 |
說明 |
PROPAGATION_REQUIRED |
如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。 |
PROPAGATION_SUPPORTS |
支持當前事務,如果當前沒有事務,就以非事務方式執行。 |
PROPAGATION_MANDATORY |
使用當前的事務,如果當前沒有事務,就拋出異常。 |
PROPAGATION_REQUIRES_NEW |
新建事務,如果當前存在事務,把當前事務掛起。 |
PROPAGATION_NOT_SUPPORTED |
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 |
PROPAGATION_NEVER |
以非事務方式執行,如果當前存在事務,則拋出異常。 |
PROPAGATION_NESTED |
如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類 似的操作。 |
Java代碼
-
spring 事務註解
-
-
默認遇到throw new RuntimeException("...");會回滾
-
需要捕獲的throw new Exception("...");不會回滾
-
-
// 指定回滾
-
@Transactional(rollbackFor=Exception.class)
-
public void methodName() {
-
// 不會回滾
-
throw new Exception("...");
-
}
-
//指定不回滾
-
@Transactional(noRollbackFor=Exception.class)
-
public ItimDaoImpl getItemDaoImpl() {
-
// 會回滾
-
throw new RuntimeException("註釋");
-
}
-
-
// 如果有事務,那麼加入事務,沒有的話新建一個(不寫的情況下)
-
@Transactional(propagation=Propagation.REQUIRED)
-
// 容器不爲這個方法開啓事務
-
@Transactional(propagation=Propagation.NOT_SUPPORTED)
-
// 不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務
-
@Transactional(propagation=Propagation.REQUIRES_NEW)
-
// 必須在一個已有的事務中執行,否則拋出異常
-
@Transactional(propagation=Propagation.MANDATORY)
-
// 必須在一個沒有的事務中執行,否則拋出異常(與Propagation.MANDATORY相反)
-
@Transactional(propagation=Propagation.NEVER)
-
// 如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務.
-
@Transactional(propagation=Propagation.SUPPORTS)
-
-
/*
-
public void methodName(){
-
// 本類的修改方法 1
-
update();
-
// 調用其他類的修改方法
-
otherBean.update();
-
// 本類的修改方法 2
-
update();
-
}
-
other失敗了不會影響 本類的修改提交成功
-
本類update的失敗,other也失敗
-
*/
-
@Transactional(propagation=Propagation.NESTED)
-
// readOnly=true只讀,能插入,但不能更新,刪除
-
@Transactional (propagation = Propagation.REQUIRED,readOnly=true)
-
// 設置超時時間
-
@Transactional (propagation = Propagation.REQUIRED,timeout=30)
-
// 設置數據庫隔離級別
- @Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)