spring service事務傳播


spring定義的事務行為有以下幾種:

REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執行。
MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。
REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。
NESTED--如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。

事務傳播指service方法調用另一個service方式時,被調用方法的事務行為。這種行為分為兩種調用方式來區分:

1.service內部方法間調用:

    被調用方法設定的事務行為將會失效,事務行為由最外層方法設置的事務行為控制。

2.一個service調用另一個service的方法

    當兩個service方法不屬於同一個事務時,被調用方法出現的異常時不會導致外部方法事務回滾,但會使外部方法執行出現異常(可選擇是否捕獲);如果是屬於同一個事務,外部方法捕獲異常將會導致被調用方法不回滾。

 

Spring的事務到底該給Dao配置還是給Service配置?

Spring事務為業務邏輯進行事務管理,保證業務邏輯上數據的原子性。

事務得根據項目性質來細分:事務可以設置到三個層面(dao層、service層和web層)。
第一:web層事務,這一般是針對那些安全性要求較高的系統來說的。例如電子商務網站。粒度小,一般系統用不着這么細。
第二:service層事務,這是一常見的事務划分, 將事務設置在業務邏輯上,只要業務邏輯出錯或異常就事務回滾。粒度較小,一般推薦這種方式。
第三:數據持久層數據務,也就是常說的數據庫事務。這種事務在安全性方面要求低。就是給一個簡單的增刪改之類的操作增加事務操作。粒度大

給Service層配置事務,因為一個Service層方法操作可以關聯到多個DAO的操作。在Service層執行這些Dao操作,多DAO操作有失敗全部回滾,成功則全部提交。

事務分為業務事務和系統事務,業務事務也就是業務邏輯上操作的一致性,系統事務自然就是指真正的數據庫事務,

Spring配置事務的是為了什么進行管理,當然是為業務邏輯進行事務管理,保證業務邏輯上數據的原子性;
Dao層是什么,數據訪問層,是不應該包含業務邏輯的,這就是和Service層的不同;
Service層就是業務邏輯層,事務的管理就是為Service層上的保證。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM