Spring 之註解事務 @Transactional

Spring在TransactionDefinition接口中規定了7種類型的事務傳播行爲,
它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:
事務傳播行爲類型

事務傳播行爲類型
說明
PROPAGATION_REQUIRED
如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS
支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY
使用當前的事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW
新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER
以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED
如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類 似的操作。


Java代碼 
  1. spring 事務註解  
  2.   
  3. 默認遇到throw new RuntimeException("...");會回滾  
  4. 需要捕獲的throw new Exception("...");不會回滾  
  5.   
  6. // 指定回滾  
  7. @Transactional(rollbackFor=Exception.class)   
  8.     public void methodName() {  
  9.        // 不會回滾  
  10.        throw new Exception("...");  
  11.     }   
  12. //指定不回滾  
  13. @Transactional(noRollbackFor=Exception.class)  
  14.     public ItimDaoImpl getItemDaoImpl() {  
  15.         // 會回滾  
  16.         throw new RuntimeException("註釋");  
  17.     }   
  18.   
  19.     // 如果有事務,那麼加入事務,沒有的話新建一個(不寫的情況下)  
  20.     @Transactional(propagation=Propagation.REQUIRED)   
  21.     // 容器不爲這個方法開啓事務  
  22.     @Transactional(propagation=Propagation.NOT_SUPPORTED)  
  23.     // 不管是否存在事務,都創建一個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務  
  24.     @Transactional(propagation=Propagation.REQUIRES_NEW)   
  25.     // 必須在一個已有的事務中執行,否則拋出異常  
  26.     @Transactional(propagation=Propagation.MANDATORY)  
  27.     // 必須在一個沒有的事務中執行,否則拋出異常(與Propagation.MANDATORY相反)  
  28.     @Transactional(propagation=Propagation.NEVER)   
  29.     // 如果其他bean調用這個方法,在其他bean中聲明事務,那就用事務.如果其他bean沒有聲明事務,那就不用事務.  
  30.     @Transactional(propagation=Propagation.SUPPORTS)   
  31.       
  32.     /* 
  33.     public void methodName(){ 
  34.        // 本類的修改方法 1 
  35.        update(); 
  36.        // 調用其他類的修改方法 
  37.        otherBean.update(); 
  38.        // 本類的修改方法 2 
  39.        update(); 
  40.     } 
  41.     other失敗了不會影響 本類的修改提交成功 
  42.     本類update的失敗,other也失敗 
  43.     */  
  44. @Transactional(propagation=Propagation.NESTED)   
  45. // readOnly=true只讀,能插入,但不能更新,刪除   
  46. @Transactional (propagation = Propagation.REQUIRED,readOnly=true)   
  47. // 設置超時時間  
  48. @Transactional (propagation = Propagation.REQUIRED,timeout=30)  
  49. // 設置數據庫隔離級別  
  50. @Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章