帶你讀懂Spring 事務——認識事務

帶你讀懂Spring事務的第一篇,我們先來了解什麼是事務, 使用生動的栗子幫你對事務的概念和特性進行理解

一、什麼是事務?

事務是恢復和併發控制的基本單位,一個事務包含了聲明該事務開始到聲明該事務結束之間的所有操作。

舉個栗子:郝大(錘子的一個朋友)向錘子轉賬10元錢,我們將這個操作命名爲“事務A",描述如下:
1.begin transaction for 事務A;
2.從郝大賬戶扣除10元錢;
3.向錘子賬戶增加10元錢;
4.end transaction for 事務A;

我們在編程中常說的事務實際上都是對數據庫的一系列操作的集合,其實在關係型數據庫中一條SQL就是一個事務,但在編寫一些複雜業務邏輯時,往往一條sql語句並不能滿足我們的要求,這時我們就需要把一系列操作組合在一起,然後聲明一個事務將這一系列操作包裹起來,這樣這一系列的操作就成爲了我們的一個新的事務

二、事務的ACID特性

  • 原子性:事務是一個原子操作,原子性保證了組成事務的一系列操作要麼全部完成,要麼完全不起作用。

郝大給錘子轉賬10元:郝大賬戶扣除10元和錘子賬戶增加10元,原子性保證了這兩個操作,要麼都完成,要麼都不起作用,不會出現,操作1(郝大賬戶扣除10元)成功而操作2(錘子賬戶增加10元)失敗,這樣錢就憑空消失了

  • 一致性:一旦事務完成(無論成功還是失敗),系統的狀態都是從一個一致狀態轉換到另一個一致狀態,不會出現中間狀態。

郝大給錘子轉賬10元,假設郝大賬戶有100元,錘子賬戶有20元:初始狀態(郝大賬戶100元,錘子賬戶50元),結束狀態(郝大賬戶90元,錘子賬戶60元),無論事務成功與否,系統的狀態要麼維持初始狀態(失敗),要麼轉變爲結束狀態(成功),不會出現中間狀態(eg:郝大賬戶90元,錘子賬戶50元),一致性和原子性密切相關的一個特性。

  • 隔離性:一個事務的執行不能被其他事務干擾,也就是一個事務內部的操作對併發的其他事務而言是隔離的,併發執行的各個事務之間不會相互干擾。

郝大給錘子轉賬10元是一個事務A,同時併發執行的張三給李四轉賬20元是另一個事務B,這兩個事務在執行的時候是相互隔離,事務A執行的成功與否不會影響事務B,同理事務B對A也是如此。
*這時你是否會有疑惑,如果兩個事務操作的是同一份數據,那麼併發執行,數據豈不是亂了?*其實這個跟事務的隔離級別有關係,設置不同的事務隔離級別會改變事務的實際執行過程,在設置事務隔離級別爲最高隔離級別時,當兩個併發事務操作同一份數據時,在真正執行時兩個事務就成串行執行了,即事務A執行完事務B纔會執行,就可以避免影響數據安全的問題發生。當然如果所有的事務的隔離級別都設置爲最高隔離級別就會使得所有的事務串行執行,也就會降低效率,所以事務的隔離基本設置是要因業務不同而異。關於事務隔離級別我會專門寫一篇文章詳細講解,歡迎關注

  • 持久性指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的,不會因爲之後該事務之外的操作對其影響

郝大給錘子轉賬10元這個事務一旦執行成功提交後,數據庫的狀態就變爲郝大賬戶90元,錘子賬戶60元,這個結果是持久化到數據庫的,就會一直存下去,不會因爲後續的其他問題導致數據變化

三、Spring事務的管理方式

在Spring中的事務主要有兩種管理方式:編程式事務管理和聲明式事務管理

編程式事務

編程式事務是使用TransactionTemplate或者PlatformTransactionManager來進行事務實現。

編程式事務的意思就是你在編程的時候需要在代碼中顯式的調用事務的處理方法。

舉個栗子:郝大給錘子轉賬10元的操作使用編程式事務的僞代碼描述如下


begin Transaction();
try{  
	郝大賬戶扣除10;  
	錘子賬戶增加10;
	commit();  //事務成功執行則提交事務
}catch(Exection e){
	rollback(); //事務執行異常,則回退
}
end Transaction();

聲明式事務

聲明式事務是建立在Spring AOP之上的,使用AOP對目標方法進行攔截,在目標方法開始之前創建或者加入一個事務,在執行完目標方法之後根據執行情況提交事務或者回滾事務。

聲明式事務的優點就是不需要主動在編程的代碼中編寫事務相關的代碼方法,只需在配置文件中制定相關的事務規則聲明或者通過基於@Transactional註解的方式進行事務的聲明。

舉個栗子:郝大給錘子轉賬10元的操作使用聲明式事務的僞代碼描述如下


//使用註解聲明事務(事務的傳播機制,後續文章會詳細講解和演示)
@Transactional(事務傳播機制)
method(){
	郝大賬戶扣除10;  
	錘子賬戶增加10;
}

文章歡迎轉載,轉載請註明出處,個人公衆號【愛做夢的錘子】,全網同id,個站 http://te-amo.site,歡迎關注,裏面會分享更多有用知識,還有我的私密照片

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