Spring事務的傳播行為和隔離等級,spring交易隔離等級

來源:互聯網
上載者:User

Spring事務的傳播行為和隔離等級,spring交易隔離等級

1.事務的傳播行為

        事務的使用過程中,用的最多的傳播行為是require,在大部分的mis系統裡,可以對整個業務層切一個require的事務就可以滿足需要。

        但spring提供的不僅如此,對於複雜的業務,Spring也提供了相應的事務傳播行為來滿足業務需要。

        Spring中的傳播行為如下:

        Require:支援當前事務,如果沒有事務,就建一個新的,這是最常見的;

        Supports:支援當前事務,如果當前沒有事務,就以非事務方式執行;

        Mandatory:支援當前事務,如果當前沒有事務,就拋出異常;

        RequiresNew:建立事務,如果當前存在事務,把當前事務掛起;

        NotSupported:以非事務方式執行操作,如果當前存在事務,就把事務掛起;

        Never:以非事務方式執行,如果當前存在事務,則拋出異常。

        Nested:建立事務,如果當前存在事務,把當前事務掛起。與RequireNew的區別是與父事務相關,且有一個savepoint。

        其中,Require、Supports、NotSupported、Never兩個看文字也就能瞭解,就不多說了。而Mandatory是要求所有的操作必須在一個事務裡,較Require來說,對事務要求的更加嚴格。

        RequireNew:當一個Require方法A調用RequireNew方法B時,B方法會新new一個事務,並且這個事務和A事務沒有關係,也就是說B方法出現異常,不會導致A的復原,同理當B已提交,A再出現異常,B也不會復原。

        Nested:這個和RequireNew的區別是B方法的事務和A方法的事務是相關的。只有在A事務提交的時候,B事務都會提交。也就是說當A發生異常時,A、B事務都復原,而當B出現異常時,B復原,而A復原到savepoint,如下代碼所示:

public void A(){    //操作1    //操作2    //操作3    try{        //savepoint        B();//一個Nested的方法    } catch{        //出現異常,B方法復原,A方法復原到        //savepoint,也就是說操作1、2、3 都還在       C();    } finally{    }}   


2.事務的隔離等級
        說完了事務傳播的行為,現在再說下交易隔離等級,交易隔離等級的出現,是為了使你在效能與資料的有效性之間做一個平衡,不是說層級越高越好,只有合適才是最好的。

        交易隔離等級如下:

        Serializable:最嚴格的層級,事務串列執行,資源消耗最大;

        Repeatable Read:保證了一個事務不會修改已經由另一個事務讀取但未提交(復原)的資料。

        Read Committed:大多數主流資料庫的預設事務等級,保證了一個事務不會讀到另一個並行事務已經修改但未提交的資料。適用於大多數系統。

        Read Uncommitted:保證了讀取過程中不會讀取到非法資料。

        想要理解這四個層級,還需要知道三種不討人喜歡的事情:

        dirty reads:髒讀,就是說事務A未提交的資料被事務B讀走,如果事務A失敗復原,將導致B所讀取的資料是錯誤的。

        non-repeatable reads:不可重複讀取,就是說事務A中兩處讀取資料,第一次讀時是100,然後事務B把值改成了200,事務A再讀一次,結果就發現值變了,造成A交易資料混亂。

        phantom read:幻讀,和不可重複讀取相似,也是同一個事務中多次讀不一致的問題。但是不可重複讀取的不一致是因為它所要取的資料集被改變了,而幻讀所要讀的資料不一致卻不是他所要讀的資料改變,而是它的條件資料集改變。比如:Select id where name="ppgogo*",第一次讀去了6個合格id,第二次讀時,由於事務B把第一個貼的名字由"dd"改成了“ppgogo9”,結果取出來7個資料。

        而事務的隔離等級會導致讀取到非法資料的情況如下表示:

        


spring的事務有幾種方式?談談spring事務的隔離等級與傳播行為

1、Propagation
  key屬性確定代理應該給哪個方法增加事務行為。這樣的屬性最重要的部份是傳播行為。有以下選項可供使用:
PROPAGATION_REQUIRED--支援當前事務,如果當前沒有事務,就建立一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS--支援當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY--支援當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW--建立事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。
2、Isolation Level(事務隔離等級):
1、Serializable:最嚴格的層級,事務串列執行,資源消耗最大;
2、REPEATABLE READ:保證了一個事務不會修改已經由另一個事務讀取但未提交(復原)的資料。避免了“髒讀取”和“不可重複讀取”的情況,但是帶來了更多的效能損失。
3、READ COMMITTED:大多數主流資料庫的預設事務等級,保證了一個事務不會讀到另一個並行事務已修改但未提交的資料,避免了“髒讀取”。該層級適用於大多數系統。
4、Read Uncommitted:保證了讀取過程中不會讀取到非法資料。
隔離等級在於處理多事務的並發問題。我們知道並行可以提高資料庫的輸送量和效率,但是並不是所有的並發事務都可以並發運行,這需要查看資料庫教材的可序列化條件判斷了。
 
spring的傳播行為與隔離等級

在使用Spring時,大部分會用到他的聲明式事務,簡單的在設定檔中進行一些規則配置,利用Spring的AOP功能就能輕鬆搞定事務問題;這裡面就涉及到一個事務的傳播屬性問題Propagation,它在TransactionDefinition介面中定義,以供PlatfromTransactionManager使用,PlatfromTransactionManager是spring交易管理的核心介面。

TransactionDefinition
public interface TransactionDefinition {
 int getPropagationBehavior();
 int getIsolationLevel();
 int getTimeout();
 boolean isReadOnly();
}

  getTimeout()方法,它返回事務必須在多少秒內完成。

  isReadOnly(),事務是否唯讀,交易管理員能夠根據這個傳回值進行最佳化,確保事務是唯讀。

  getIsolationLevel()方法返回事務的隔離等級,交易管理員根據它來控制另外一個事務可以看到本事務內的哪些資料。

  在TransactionDefinition介面中定義了五個不同的交易隔離等級,ISOLATION_DEFAULT 這是一個PlatfromTransactionManager預設的隔離等級,使用資料庫預設的交易隔離等級.另外四個與JDBC的隔離等級相對應,ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離等級,它充許別外一個事務可以看到這個事務未提交的資料。這種隔離等級會產生髒讀,不可重複讀取和幻像讀。

  在TransactionDefinition介面中共有7種選項可用:

  PROPAGATION_REQUIRED:支援當前事務,如果當前沒有事務,就建立一個事務。這是最常見的選擇。

  PROPAGATION_SUPPORTS:支援當前事務,如果當前沒有事務,就以非事務方式執行。

  PROPAGATION_MANDATORY:支援當前事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW:建立事務,如果當前存在事務,把當前事務掛起。

  PROPAGATION_NOT_SUPPORTED:以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

  PROPAGATION_NEVER:以非事務方式執行,如果當前存在事務,則拋出異常。

  PROPAGATION_NESTED:支援當前事務,新增Savepoint點,與當前事務同步提交或復原。
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.