spring進行事務管理

2022-04-13 02:41:10 字數 1643 閱讀 5805

用jdbc的事務管理器:datasourcetransactionmanager

而啟用事務註解中的transaction-manager值必須是trasactionmanager,若配置的事務管理器的id為trasactionmanager,nametransaction-manager可以不寫

然後在service的實現層中新增事務註解:在對應的service實現了的方法上新增@transactional註解。

在service服務層中存在兩個方法,而這兩個方法都有各自的事務宣告,如果其中乙個方法呼叫另乙個方法,被呼叫的方法使用呼叫者的事務,還是用自己的事務呢?此時就涉及到了事務的傳播了。

spring的七個事務傳播屬性:

propagation_required -- 支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇。

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

propagation_mandatory -- 支援當前事務,如果當前沒有事務,就丟擲異常。

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

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

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

propagation_nested -- 如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,

此時不指定事務的傳播行為,預設行為是required,那麼purchase事務方法到底是用自己的事務呢?還是用checkout的事務呢?

結果是purchase方法用的是checkout的事務,也就是說當purchase方法第一次執行成功了,第二次執行失敗了,那麼結果會回滾到checkout最原始的狀態,第一次也預設是失敗了

當指定傳播行為(傳播行為的指定要在被呼叫方法上進行指定,也就是在purchase方法上進行指定)為propagation_requires_new時,結果如何呢?

次傳播行為造成的結果就是,當purchase方法第一次執行成功了,第二次執行失敗了,只會回滾到purchase第二次執行開始的狀態,而checkout方法不會進行回滾,purchase方法第一次成功了就是成功了。

對於所拋異常的型別我們可以自己進行建立,建立個類名稱自己定義,將此類繼承runtimeexception異常類,在自定義異常類中建立構造器即可,無需對方法中新增其他任何**,我們只是為了想要得到自己定義的異常名稱,那麼拋異常的時候就可以這樣寫了,例如自定義異常useraccountexception,就可以這樣拋異常

throw new useraccountexception("自定義異常內容");

Spring 使用註解方式進行事務管理

大家在使用spring的註解式事務管理時,對事務的傳播行為和隔離級別可能有點不知所措,下邊就詳細的介紹下以備方便查閱。事物註解方式 transactional 當標於類前時,標示類中所有方法都進行事物處理 transactional public class testservicebean impl...

Spring 使用註解方式進行事務管理

使用步驟 步驟 一 在spring配置檔案中引入命名空間 xmlns xsi xmlns tx xsi schemalocation spring beans 2.0.xsd spring tx 2.0.xsd 步驟 二 具有 transactional 註解的bean自動配置為宣告式事務支援 id...

Spring 使用註解方式進行事務管理

使用步驟 步驟一 在spring配置檔案中引入tx 命名空間 步驟二 具有 transactional 註解的bean自動配置為宣告式事務支援 步驟三 在介面或類的宣告處 寫乙個 transactional.要是只在介面上寫,介面的實現類就會繼承下來 介面的實現類的具體方法,可以覆蓋類宣告處的設定 ...