Spring 事務介紹

Spring事務傳播行爲類型:java

事務傳播行爲類型 說明
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)
相關文章
相關標籤/搜索