帶你讀懂Spring事務的第一篇,我們先來了解什么是事務, 使用生動的栗子幫你對事務的概念和特性進行理解
一、什么是事務?
事務是恢復和并發(fā)控制的基本單位敏弃,一個事務包含了聲明該事務開始到聲明該事務結束之間的所有操作笛辟。
舉個栗子:郝大(錘子的一個朋友)向錘子轉賬10元錢,我們將這個操作命名為“事務A",描述如下:
1.begin transaction for 事務A;
2.從郝大賬戶扣除10元錢;
3.向錘子賬戶增加10元錢;
4.end transaction for 事務A;
我們在編程中常說的事務實際上都是對數(shù)據(jù)庫的一系列操作的集合宫患,其實在關系型數(shù)據(jù)庫中一條SQL就是一個事務刊懈,但在編寫一些復雜業(yè)務邏輯時,往往一條sql語句并不能滿足我們的要求娃闲,這時我們就需要把一系列操作組合在一起虚汛,然后聲明一個事務將這一系列操作包裹起來,這樣這一系列的操作就成為了我們的一個新的事務
二皇帮、事務的ACID特性
- 原子性:事務是一個原子操作卷哩,原子性保證了組成事務的一系列操作要么全部完成,要么完全不起作用属拾。
郝大給錘子轉賬10元:郝大賬戶扣除10元和錘子賬戶增加10元将谊,原子性保證了這兩個操作,要么都完成捌年,要么都不起作用瓢娜,不會出現(xiàn),操作1(郝大賬戶扣除10元)成功而操作2(錘子賬戶增加10元)失敗礼预,這樣錢就憑空消失了
- 一致性:一旦事務完成(無論成功還是失斆呃),系統(tǒng)的狀態(tài)都是從一個一致狀態(tài)轉換到另一個一致狀態(tài),不會出現(xiàn)中間狀態(tài)褒颈。
郝大給錘子轉賬10元柒巫,假設郝大賬戶有100元,錘子賬戶有20元:初始狀態(tài)(郝大賬戶100元谷丸,錘子賬戶50元)堡掏,結束狀態(tài)(郝大賬戶90元,錘子賬戶60元)刨疼,無論事務成功與否泉唁,系統(tǒng)的狀態(tài)要么維持初始狀態(tài)(失敗)揩慕,要么轉變?yōu)榻Y束狀態(tài)(成功)亭畜,不會出現(xiàn)中間狀態(tài)(eg:郝大賬戶90元,錘子賬戶50元)迎卤,一致性和原子性密切相關的一個特性拴鸵。
- 隔離性:一個事務的執(zhí)行不能被其他事務干擾,也就是一個事務內(nèi)部的操作對并發(fā)的其他事務而言是隔離的蜗搔,并發(fā)執(zhí)行的各個事務之間不會相互干擾劲藐。
郝大給錘子轉賬10元是一個事務A,同時并發(fā)執(zhí)行的張三給李四轉賬20元是另一個事務B樟凄,這兩個事務在執(zhí)行的時候是相互隔離聘芜,事務A執(zhí)行的成功與否不會影響事務B,同理事務B對A也是如此不同。
這時你是否會有疑惑厉膀,如果兩個事務操作的是同一份數(shù)據(jù),那么并發(fā)執(zhí)行二拐,數(shù)據(jù)豈不是亂了服鹅?其實這個跟事務的隔離級別有關系,設置不同的事務隔離級別會改變事務的實際執(zhí)行過程百新,在設置事務隔離級別為最高隔離級別時企软,當兩個并發(fā)事務操作同一份數(shù)據(jù)時,在真正執(zhí)行時兩個事務就成串行執(zhí)行了饭望,即事務A執(zhí)行完事務B才會執(zhí)行仗哨,就可以避免影響數(shù)據(jù)安全的問題發(fā)生。當然如果所有的事務的隔離級別都設置為最高隔離級別就會使得所有的事務串行執(zhí)行铅辞,也就會降低效率厌漂,所以事務的隔離基本設置是要因業(yè)務不同而異。關于事務隔離級別我會專門寫一篇文章詳細講解斟珊,歡迎關注
- 持久性指一個事務一旦提交苇倡,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應該是永久性的,不會因為之后該事務之外的操作對其影響
郝大給錘子轉賬10元這個事務一旦執(zhí)行成功提交后,數(shù)據(jù)庫的狀態(tài)就變?yōu)楹麓筚~戶90元旨椒,錘子賬戶60元晓褪,這個結果是持久化到數(shù)據(jù)庫的,就會一直存下去综慎,不會因為后續(xù)的其他問題導致數(shù)據(jù)變化
三涣仿、Spring事務的管理方式
在Spring中的事務主要有兩種管理方式:編程式事務管理和聲明式事務管理
編程式事務
編程式事務是使用TransactionTemplate或者PlatformTransactionManager來進行事務實現(xiàn)。
編程式事務的意思就是你在編程的時候需要在代碼中顯式的調(diào)用事務的處理方法示惊。
舉個栗子:郝大給錘子轉賬10元的操作使用編程式事務的偽代碼描述如下
begin Transaction();
try{
郝大賬戶扣除10元;
錘子賬戶增加10元;
commit(); //事務成功執(zhí)行則提交事務
}catch(Exection e){
rollback(); //事務執(zhí)行異常好港,則回退
}
end Transaction();
聲明式事務
聲明式事務是建立在Spring AOP之上的,使用AOP對目標方法進行攔截米罚,在目標方法開始之前創(chuàng)建或者加入一個事務媚狰,在執(zhí)行完目標方法之后根據(jù)執(zhí)行情況提交事務或者回滾事務。
聲明式事務的優(yōu)點就是不需要主動在編程的代碼中編寫事務相關的代碼方法阔拳,只需在配置文件中制定相關的事務規(guī)則聲明或者通過基于@Transactional注解的方式進行事務的聲明。
舉個栗子:郝大給錘子轉賬10元的操作使用聲明式事務的偽代碼描述如下
//使用注解聲明事務(事務的傳播機制类嗤,后續(xù)文章會詳細講解和演示)
@Transactional(事務傳播機制)
method(){
郝大賬戶扣除10元;
錘子賬戶增加10元;
}
文章歡迎轉載糊肠,轉載請注明出處,個人公眾號【愛做夢的錘子】遗锣,全網(wǎng)同id货裹,個站 http://te-amo.site,歡迎關注精偿,里面會分享更多有用知識弧圆,還有我的私密照片