Spring在TransactionDefinition接口中規定了7種類型的事務傳播行為,
它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:
事務傳播行為類型
事務傳播行為類型 |
說明 |
PROPAGATION_REQUIRED |
如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。 |
PROPAGATION_SUPPORTS |
支持當前事務,如果當前沒有事務,就以非事務方式執行。 |
PROPAGATION_MANDATORY |
使用當前的事務,如果當前沒有事務,就拋出異常。 |
PROPAGATION_REQUIRES_NEW |
新建事務,如果當前存在事務,把當前事務掛起。 |
PROPAGATION_NOT_SUPPORTED |
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。 |
PROPAGATION_NEVER |
以非事務方式執行,如果當前存在事務,則拋出異常。 |
PROPAGATION_NESTED |
如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類 似的操作。 |
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)