談談Spring 中事務的隔離級別

 

PROPAGATION_REQUIRES_NEW

新建事務,如果當前存在事務,把當前事務掛起。如果把事務的傳播級別設爲REQUIRES_NEW,有可能會造成事物的不一致性。
需求:ServiceA ServiceBServiceA中會處理該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類似的操作。

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