spring的@Transactional註解

spring支持【編程式事務管理】【聲明式事務管理】兩種方式。

聲明式事務

聲明式事務管理建立在AOP之上的。其本質是對方法前後進行攔截,然後在目標方法開始之前創建或者加入一個事務,在執行完目標方法之後根據執行情況提交或者回滾事務。

聲明式事務最大的優點就是不需要通過編程的方式管理事務,這樣就不需要在業務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關的事務規則聲明(或通過基於@Transactional註解的方式),便可以將事務規則應用到業務邏輯中。


事務傳播行爲

所謂事務的傳播行爲是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行爲。在TransactionDefinition定義中包括瞭如下幾個表示傳播行爲的常量:

TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。這是默認值。

TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。

TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。

TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。

TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。

TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。

TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作爲當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。



@Transactional 註釋時沒有指定任何額外的註釋參數。我發現許多開發人員在使用 @Transactional 註釋時並沒有花時間理解它的作用。

例如,像我一樣在清單 4 中單獨使用 @Transactional 註釋時,

(1)事務傳播模式被設置成什麼呢?

(2)只讀標誌被設置成什麼呢?

(3)事務隔離級別的設置是怎樣的?

(4)更重要的是,事務應何時回滾工作?

理解如何使用這個註釋對於確保在應用程序中獲得合適的事務支持級別非常重要。回答我剛纔提出的問題:

(1)在單獨使用不帶任何參數的 @Transactional 註釋時,傳播模式要設置爲 REQUIRED

(2)只讀標誌設置爲 false

(3)事務隔離級別設置爲 READ_COMMITTED

(4)而且事務不會針對受控異常(checked exception)回滾。




參考:

@Transactional只讀標誌陷阱

spring事務說明

事務傳播級別


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