事務的七種傳播行爲(以代碼爲例,做個筆記)

PROPAGATION_REQUIRED:支持當前事務,如果不存在,則創建一個新事務。類似於同名的EJB事務屬性。這是事務註釋的默認設置。

PROPAGATION_SUPPORTS:支持當前事務,如果不存在則以非事務方式執行。同名EJB事務屬性。

注意:對於具有事務同步的事務管理器,PROPAGATION_SUPPORTS與沒有事務略有不同,因爲它定義了同步將應用的事務範圍。因此,對於整個指定的範圍,將共享相同的資源(JDBC連接,Hibernate會話等)。 請注意,這取決於事務管理器的實際同步配置。

PROPAGATION_MANDATORY:支持當前事務,如果不存在則拋出異常。同名EJB事務屬性。
PROPAGATION_REQUIRES_NEW:創建一個新事務,並掛起當前事務(如果存在)。同名EJB事務屬性。注意:實際的事務暫停將無法在所有事務管理器中運行。 這特別適用於org.springframework.transaction.jta.JtaTransactionManager,它需要javax.transaction.TransactionManager使其可用(在標準Java EE中是特定於服務器的)。

PROPAGATION_NOT_SUPPORTED:執行非事務性操作,暫停當前事務(如果存在)。同名EJB事務屬性。
注意:實際的事務暫停將無法在所有事務管理器中運行.這特別適用於org.springframework.transaction.jta.JtaTransactionManager,它需要javax.transaction.TransactionManager使其可用(在標準Java EE中是特定於服務器的)。

PROPAGATION_NEVER:執行非事務性操作,如果事務存在,則拋出異常。類似於同名的EJB事務屬性。

PROPAGATION_NESTED:如果當前事務存在,則在嵌套事務中執行,其行爲類似於PROPAGATION_REQUIRED 。 EJB中沒有類似的功能。

注意:實際創建嵌套事務僅適用於特定事務管理器。 開箱即用,這僅適用於處理JDBC 3.0驅動程序時的JDBCDataSourceTransactionManager。一些JTA提供程序也可能支持嵌套事務。

下面是我自己的一些代碼例子:

1.PROPAGATION_REQUIRED

未加事務,兩條數據正常插入.

加上事務

運行報錯,identifier of an instance of com.example.demo.entity.BankAccount was altered from 7 to 8,很簡單,因爲jpa中Persistent狀態下的實體不允許修改id,表明這看似是兩個事務,實際上合併成一個事務了,看數據庫,未插入數據,表明被回滾了,是bankaccountservice2拋出的異常,兩個插入都回滾了,真的變成一個事務了;

數據回滾了,再一次證明了,PROPAGATION_REQUIRED是事務合併成一個事務了

2.Propagation.SUPPORTS

若是bankaccountservice1有事務,那麼和PROPAGATION_REQUIRED沒區別,若是沒有事務,兩個service,一個都不會回滾

3.PROPAGATION_MANDATORY ,與Propagation.SUPPORTS的區別在於,一旦BankAccountService1沒有事務,就會報錯

4.Propagation.REQUIRES_NEW 

兩個都回滾了

只有一個數據回滾,表明bankaccountservice1的異常不會干擾到bankaccountservice2

還是兩個都回滾了

還是隻有一條數據,service2成功插入,而1回滾了,這就表明Propagation.REQUIRES_NEW,它的上一層,還是會捕捉到自己的產生異常,從而回滾,但是它的上一層產生的異常是不會對自己產生影響的

5.Propagation.NOT_SUPPORTED

service1沒有插入數據,而service2插入數據,表明,無論service2有沒有事務,但是異常仍然會被service1捕捉到以至回滾

6.PROPAGATION_NEVER

與Propagation.NOT_SUPPORTED區別就在於,如果service1有事務,service2會拋異常

7.PROPAGATION_NESTED

會一起回滾

也回滾了;

和required區別在於,一旦service2try catch了異常,service1不會回滾,但是required無論你在哪發生異常,都會回滾,這就是我爲什麼說required行爲下,都是一個事務的原因

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章