spring事務詳解(一)初探事務
spring事務詳解(二)簡單樣例
spring事務詳解(三)原始碼詳解
spring事務詳解(四)測試驗證
spring事務詳解(五)總結提高
在spring中,事務有兩種實現方式:
程式設計式事務管理:程式設計式事務管理使用底層原始碼可實現更細粒度的事務控制。spring推薦使用transactiontemplate,典型的模板模式。
申明式事務管理:新增@transactional註解,並定義傳播機制+回滾策略。基於spring aop實現,本質是對方法前後進行攔截,然後在目標方法開始之前建立或者加入乙個事務,在執行完目標方法之後根據執**況提交或者回滾事務。
建立使用者時,新建乙個使用者餘額表。如果使用者餘額建立失敗丟擲異常,那麼使用者表也回滾,即要保證「新增使用者+新增使用者餘額」一起成功 或 回滾。
如下圖,只需要在service.impl層,業務方法上新增@transactional註解,定義事務的傳播機制為required(不寫這個引數,預設就是required),遇到exception異常就一起回滾。
required傳播機制下:存在加入事務,不存在建立新事務。保證了當前方法中的所有資料庫操作都在乙個物理事務中,當遇到異常時會整個業務方法一起回滾。
1/**2
* 建立使用者並建立賬戶餘額3*
4* @param
name5*
@param
balance6*
@return7*/
8 @transactional(propagation= propagation.required, rollbackfor = exception.class)9
@override
10public
void
adduserbalanceanduser(string name, bigdecimal balance)
程式設計式事務管理,我們使用spring推薦的transactiontemplate。我這裡因為使用的是spring cloud的註解配置,實現用了自動配置類配置好了transactiontemplate這個型別的bean.使用的時候直接注入bean使用即可(當然老式的xml配置也是一樣的)。如下:
1/**2
* 建立使用者並建立賬戶餘額(手動事務,不帶結果)3*
4* @param
name5*
@param
balance6*
@return7*/
8@override
9public
void
adduserbalanceanduserwithintt(string name, bigdecimal balance) catch
(exception e) ",e);30}
3132}33
});34 }
注意:1.可以不用try catch,transactiontemplate.execute自己會捕捉異常並回滾。--》推薦
2.如果有業務異常需要特殊處理,記得:status.setrollbackonly(); 標識為回滾。--》特殊情況才使用
spring支援的這兩種方式都可以,個人認為大部分情況下@transactional可以滿足需要。
Spring事務詳解
事務傳播行為型別 說明propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是最常見的選擇。propagation supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。propagation mandatory 使用...
Spring事務詳解
什麼叫事務?關於事務,最簡單最常見的例子就是取錢。atm機取錢有兩個步驟,第一步輸入金額密碼,銀行卡扣掉1000元,第二步atm出鈔1000元,這兩個步驟必須要麼都執行成功,要麼都不執行。如果其中乙個步驟失敗了,必須把整個過程回滾,取消掉所有操作,這就是事務最基本的應用,事務就是用來解決類似問題的。...
spring事務詳解
1.spring事務原理 spring事務的本質其實就是資料庫對事務的支援,沒有資料庫對事務的支援就無法提供事務的功能。2.spring事務傳播屬性 propagation required 支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇,也是 spring 預設的事務的傳播。pr...