Spring事務之傳播機制

Spring事務傳播機制:
Spring在TransactionDefinition接口中規定了種類型的事務傳播行爲,它們規定了事務方法和事務方法發生嵌套時事務如何進行傳播。
即協調已經有事務標識的方法之間的發生調用時的事務上下文的規則(是否要有獨立的事務隔離級別和鎖)。html

事務的嵌套概念:
所謂事務的嵌套就是兩個事務方法之間相互調用。Spring事務開啓,或者是基於接口的,或者是基於類的代理被建立(注意必定要是代理,
不能手動new一個對象,而且此類(有無接口都行)必定要被代理————Spring中的bean只要歸入了IOC管理都是要被代理的)。
因此在同一個類中一個方法調用另外一個有事務的方法,事務是不會起做用的。spring

概述:
當咱們調用一個基於Spring的Service接口方法(如UserService#addUser())時,它將運行於Spring管理的事務環境中,
Service接口方法可能會在內部調用其它的Service接口方法以共同完成一個完整的業務操做,由於就會產生服務接口方法
嵌套調用的狀況,Spring經過事務傳播行爲控制當前的事務如何傳播到被嵌套調用的目標服務接口方法中。ide

事務傳播是Spring進行事務管理的重要概念。在下文中將詳細分析不一樣事務傳播行爲的表現形式,掌握他們之間的區別。ui

1、事務傳播行爲種類idea

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

以下爲 org.springframework.transaction.TransactionDefinition接口。代理

package org.springframework.transaction;

public interface TransactionDefinition {
    int PROPAGATION_REQUIRED = 0;
    int PROPAGATION_SUPPORTS = 1;
    int PROPAGATION_MANDATORY = 2;
    int PROPAGATION_REQUIRES_NEW = 3;
    int PROPAGATION_NOT_SUPPORTED = 4;
    int PROPAGATION_NEVER = 5;
    int PROPAGATION_NESTED = 6;
    int ISOLATION_DEFAULT = -1;
    int ISOLATION_READ_UNCOMMITTED = 1;
    int ISOLATION_READ_COMMITTED = 2;
    int ISOLATION_REPEATABLE_READ = 4;
    int ISOLATION_SERIALIZABLE = 8;
    int TIMEOUT_DEFAULT = -1;

    int getPropagationBehavior();//事務的傳播行爲

    int getIsolationLevel();//事務的隔離級別

    int getTimeout();//事務的過時時間

    boolean isReadOnly();//事務的讀寫特性

    String getName();//獲取名稱
}

01. required:是Spring默認的事務傳播行爲。指定的方法必須在事務內執行,若是沒有事務,自動建立事務並執行。code

02. support:有沒有事務都執行,有事務就在事務中執行,不然直接執行。htm

03. mandatory:若是當前存在事務,就執行該事務,若是當前不存在事務,就拋出異常。對象

04. requires_new:老是建立新事務,若是當前方法存在事務,則將當前方法事務先掛起(先執行新建立的事務,再執行被掛起的當前方法自己的事務),直到新建立的事務執行完畢。

05. not_supported:不能再事務中執行,若是當前方法存在事務,則將當前方法事務掛起。

06. never :不能在事務中執行,若是當前方法存在事務,則會拋出異常。

07. nested:若是當前存在事務,則在嵌套事務內執行。若是當前沒有事務,則執行與require相似的操做。

注意:

requires_new 是啓動一個新的,不依賴於環境的「內部」事務。

這個事務將被徹底commited或者rollback而不依賴於外部事物,它擁有本身的隔離範圍,本身的鎖等等。當內部事務開始執行時,外務事務將會被掛起,內部事務結束時,外部事物將繼續執行。

另外一方面,nested是開始一個「嵌套的」事務,它是已經存在的事務的一個真正的子事務。嵌套事務開始執行時,它將取得一個savepoint。若是這個事務執行失敗,咱們將回滾到次savepoint,嵌套事務是外部事務的一部分,只有外部事務結束後嵌套事務纔會被提交。(嵌套事務不可以提交,它必須經過外層事務來完成提交的動做,外層事務的回滾也會形成內部事務的回滾)

 

因而可知,requires_new 和 nested 最大的區別在於:

requires_new 徹底是一個新的事務,而nested則是外部事務的子事務,若是外部事務commit,嵌套事務也會被commit,這個規則一樣適用於rollback。

 

藉助例子理解,請查看 https://www.cnblogs.com/softidea/p/5962612.html

相關文章
相關標籤/搜索