1. 程式人生 > >Spring中事務傳播行為種類

Spring中事務傳播行為種類

Spring在TransactionDefinition介面中規定了7種類型的事務傳播行為,它們規定了事務方法和事務方法發生巢狀呼叫時事務如何進行傳播:

  PROPAGATION_REQUIRED

  如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。

  PROPAGATION_SUPPORTS

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

  PROPAGATION_MANDATORY

  使用當前的事務,如果當前沒有事務,就丟擲異常。

  PROPAGATION_REQUIRES_NEW

  新建事務,如果當前存在事務,把當前事務掛起。

  PROPAGATION_NOT_SUPPORTED

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

  PROPAGATION_NEVER

  以非事務方式執行,如果當前存在事務,則丟擲異常。

  PROPAGATION_NESTED

  如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

  在使用過程中需要注意以下幾點:

  1)NESTED和NEW的區別

  PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED是容易混淆的兩個傳播行為。PROPAGATION_REQUIRES_NEW 啟動一個新的、和外層事務無關的“內部”事務。該事務擁有自己的獨立隔離級別和鎖,不依賴於外部事務,獨立地提交和回滾。當內部事務開始執行時,外部事務 將被掛起,內務事務結束時,外部事務才繼續執行。由此可見, PROPAGATION_REQUIRES_NEW 和 PROPAGATION_NESTED 的最大區別在於:PROPAGATION_REQUIRES_NEW 將建立一個全新的事務,它和外層事務沒有任何關係,而 PROPAGATION_NESTED 將建立一個依賴於外層事務的子事務,當外層事務提交或回滾時,子事務也會連帶提交和回滾。巢狀事務不能夠提交,它必須通過外層事務來完成提交的動作,外層事務的回滾也會造成內部事務的回滾。

  2) 當方法被設定為PROPAGATION_NOT_SUPPORTED時,外層業務方法的事務會被掛起,當內部方法執行完成後,外層方法的事務重新執行。如果外層方法沒有事務,直接執行,不需要做任何其它的事。

  3) 當業務方法被設定為PROPAGATION_NEVER時,它將不能被擁有事務的其它業務方法呼叫。

  4) 當業務方法被設定為PROPAGATION_MANDATORY時,它就不能被非事務的業務方法呼叫。