1. 程式人生 > >spring進行事務管理

spring進行事務管理

rop 一次 exceptio ext per spring 常見 service服務 pri

一:spring使用註解的方式進行事務聲明

1.spring的聲明式事務:

用jdbc的事務管理器:DataSourceTransactionManager

首先在applicationContext.xml 文件中進行配置技術分享

這裏的property中的name就是數據庫的bean,ref對應的是applicationContext.xml 文件中的數據庫bean定義的id,也就是將數據源於事務進行綁定,

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

然後在service的實現層中添加事務註解:在對應的service實現了的方法上添加@Transactional註解。技術分享

2.事務的傳播行為:

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

spring的七個事務傳播屬性:

PROPAGATION_REQUIRED -- 支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
 PROPAGATION_SUPPORTS -- 支持當前事務,如果當前沒有事務,就以非事務方式執行。
 PROPAGATION_MANDATORY -- 支持當前事務,如果當前沒有事務,就拋出異常。
 PROPAGATION_REQUIRES_NEW -- 新建事務,如果當前存在事務,把當前事務掛起。
 PROPAGATION_NOT_SUPPORTED -- 以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
 PROPAGATION_NEVER -- 以非事務方式執行,如果當前存在事務,則拋出異常。
 PROPAGATION_NESTED -- 如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,

那麽在建一個事務方法checkout,也對此方法進行事務管理,但此時的方法調用了上一個事務方法purchase:

技術分享

此時不指定事務的傳播行為,默認行為是REQUIRED,那麽purchase事務方法到底是用自己的事務呢?還是用checkout的事務呢?

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

技術分享

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

技術分享

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

技術分享

3.事務的其他屬性(事務的隔離級別&只讀&過期)

技術分享

對於所拋異常的類型我們可以自己進行創建,創建個類名稱自己定義,將此類繼承RuntimeException異常類,在自定義異常類中創建構造器即可,無需對方法中添加其他任何代碼,我們只是為了想要得到自己定義的異常名稱,那麽拋異常的時候就可以這樣寫了,例如自定義異常UserAccountException,就可以這樣拋異常

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

spring進行事務管理