PROPAGATION_REQUIRES_NEW
新建事務,如果當前存在事務,把當前事務掛起。如果把事務的傳播級別設爲REQUIRES_NEW,有可能會造成事物的不一致性。
需求:ServiceA 與ServiceB,ServiceA中會處理該service相關的操作,但同時也需要調用ServiceB,調用必須保持事務的一致性
如上圖所示,當事務的傳播特效配置成REQUIRES_NEW,ServiceA調用ServiceB的時候,ServiceA將會被掛起,此時Spring會單獨的創建一個新的,獨立的事務,比如tx_b,tx_b如果未發生RuntimeException,爲ServiceB創建的事務tx_b會獨立提交,提交後,ServiceA的事務由掛起狀態恢復,拋出RuntimeException後,ServiceA的事務會回滾,這樣就回造成數據的不一致性。
PROPAGATION_NOT_SUPPORTED
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER
以非事務方式執行,如果當前存在事務,則拋出異常。
PROPAGATION_NESTED
如果當前存在事務,則在嵌套事務內執行。要說明的一點是,內嵌事務並不是一個獨立的事務,它依賴於外部事務的存在,只有通過外部的事務提交,才能引起內部事務的提交,嵌套的子事務不能單獨提交。如果熟悉 JDBC 中的保存點(SavePoint)的概念,那嵌套事務就很容易理解了,其實嵌套的子事務就是保存點的一個應用,一個事務中可以包括多個保存點,每一個嵌套子事務。另外,外部事務的回滾也會導致嵌套子事務的回滾(SQL Server 不支持操作 releaseSavepoint)。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。