Spring.NET學習筆記17——事務傳播行爲(基礎篇)

上篇我們學習了Spring.NET的事務機制。回顧一下,實現事務需要在方法上標記[Transaction]。在很多情況下,事務往往與業務分離。Spring.NET提供了事務代理幫我們管理這些事務,我們可以通過TransactionProxyFactoryObject使用聲明式事務。在很多情況下TransactionProxyFactoryObjectProxyFactoryObject易用,因爲該類可以通過自身屬性來指定事務通知和事務特性,所以不需要單獨爲事務通知定義對象。另外,與使用ProxyFactoryObject不同,TransactionProxyFactoryObject不要求使用方法的全名,只用普通的“短”方法名即可。同時,該類可以對方法名進行wild card matching,從而強制我們爲DAO的方法使用統一命名規則。

  TransactionProxyFactoryObjectTransactionAttributes屬性是用來配置的傳播行爲,並規定了7種類型的事務傳播行爲,它們規定了事務方法和事務方法發生嵌套調用時事務如何進行傳播:

 

PROPAGATION_REQUIRED

支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。

PROPAGATION_SUPPORTS

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

PROPAGATION_MANDATORY

支持當前事務,如果當前沒有事務,就拋出異常。

PROPAGATION_REQUIRES_NEW

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

PROPAGATION_NOT_SUPPORTED

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

PROPAGATION_NEVER

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

PROPAGATION_NESTED

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

 

 PROPAGATION_REQUIREDPROPAGATION_SUPPORTS我用的比較多,其它的很少使用。特別是PROPAGATION_REQUIRED,我絕大多數情況都使用這個行爲(如,在創建,刪除,修改的時候),我會在查詢(獲取)數據的時候設置爲:PROPAGATION_REQUIRED,readOnly,聲明爲一個只讀事務,這樣有助於性能的提高。

   TransactionProxyFactoryObjectTarget屬性是我們要攔截的對象,一般我們設置爲業務層的對象。

  

  實現代碼:

 

 

 在name-value節點下,key屬性爲Save*意思是攔截所有以Save開頭的方法,在攔截到的方法上增加PROPAGATION_REQUIRED事務傳播行爲。

 

  代碼下載

 

 

 

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