Spring 之注解事務 @Transactional


眾所周知的ACID屬性: 
原子性(atomicity)、一致性(consistency)、隔離性(isolation)以及持久性(durability)。我們無法控制一致性、原子性以及持久性,但可以控制超時,設置事務的只讀性以指定隔離級別。 
Spring在TransactionDefinition接口封裝了所有這些設置。

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)

 

事務隔離級別: 
隔離級別 說明 
ISOLATION_DEFAULT 默認級別(對大多數數據庫來說就是ISOLATION_READ_COMMITTED) 
ISOLATION_READ_UNCOMMITTED 最低的隔離級別。事實上我們不應該隔離級別,因為在事務完成前,其他事務可以看到該事務所修改的數據。而在其他事務提交前,該事務也可以看到其他事務所做的修改。 
ISOLATION_READ_COMMITTED 大多數數據庫的默認級別。在事務完成前,其他事務無法看到該事務所修改的數據。遺憾的是,在該事務提交后,你就可以查看其他事務插入活更新的數據。這意味 着在事務的不同點上,如果其他事務修改數據,你會看到不同的數據。 
ISOLATION_REPEATABLE_READ 該隔離級別確保如果在事務中查詢了某個數據集,你至少還能再次查詢到相同的數據集,即使其他事務修改了所查詢的數據。然而如果其他事務插入了新數據,你就可以查詢到該新插入的數據。 
ISOLATION_SERIALIZABLE 代價最大、可靠性最高的隔離級別,所有的事務都是俺順序一個接一個的執行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM