10分鐘學會Spring的事務管理機制

前言

在互聯(lián)網(wǎng)數(shù)據(jù)庫的使用中乌企,對于那些電商和金融網(wǎng)站,最關注的內容毫無疑問就是數(shù)據(jù)庫事務,因為對于人們商品的交易和庫存以及金融產(chǎn)品的金額睡雇,是不允許發(fā)生錯誤的。但是它們面臨的問題是饮醇,熱門產(chǎn)品或金融產(chǎn)品上線銷售瞬間可能面對的高并發(fā)的場景它抱。那么在Spring中采用哪些事務機制處理這些高并發(fā)場景的呢?

Spring事務管理

常見的Spring事務管理有以下兩種:

1. 編程式事務管理
  • 編程式事務管理需要顯示的調用beginTransaction()朴艰、rollback()观蓄、commit()等相關事務的處理方法混移,操作比較復雜,不推薦侮穿。
2.聲明式事務管理
  • 基于AOP技術實現(xiàn)的聲明式事務管理歌径,實質就是:在方法執(zhí)行前后進行攔截,然后在目標方法執(zhí)行前創(chuàng)建并加入事務亲茅,在目標方法執(zhí)行后根據(jù)結果進行事務的回滾或者提交沮脖。
  • 聲明式事務管理的實現(xiàn)有兩種:
  1. 基于XML配置文件的實現(xiàn);
    2.在業(yè)務方法上加上@Transactional注解芯急,將事務規(guī)則應用到業(yè)務邏輯中。

對于聲明式事務驶俊,是使用@Transactional進行標注的娶耍,這個注解可以標注在類或方法上,當它標注在類上時饼酿,代表這個類的所有公共的(public)非靜態(tài)的方法都將啟動事務功能榕酒。在@Transactional中,還允許配置許多的屬性故俐,如事務的傳播行為和隔離級別想鹰,以及異常類型,從而確定方法發(fā)生什么異常下回滾事務什么異常下不回滾事務等药版。這些配置內容辑舷,是在Spring IoC容器在加載時就會將這些配置信息解析出來,然后把這些信息存到事務定義器(TransactionDefinition接口的實現(xiàn)類)里槽片,記錄哪些類或者方法需要啟動事務功能何缓,采取什么策略去執(zhí)行事務。在這個過程中还栓,我們需要做的就是給需要事務的類或方法中加上@Transactional注解和配置其屬性而已碌廓。
有了@Transactional的配置,Spring就會知道在哪里啟動事務機制剩盒,其約定流程如下圖所示:


image.png
3.隔離級別

當前互聯(lián)網(wǎng)應用時刻面臨著高并發(fā)的環(huán)境谷婆,如商品庫存,時刻都是多個線程共享的數(shù)據(jù)辽聊,這樣就會在多線程的環(huán)境中扣減商品庫存纪挎。對于數(shù)據(jù)庫而言,就會出現(xiàn)多個事務同時操作同一記錄的情況身隐,這樣會引起數(shù)據(jù)出現(xiàn)不一致的情況廷区,便是數(shù)據(jù)的丟失更新(Lost Update)問題。

數(shù)據(jù)庫事務的知識

數(shù)據(jù)庫事務具有以下4個基本特性贾铝,也就是著名的ACID隙轻。

  • Atomic(原子性):事務中包含的操作被看做一個整體的業(yè)務單元埠帕,這個業(yè)務單元的操作要么全部成功,要么全部失敗玖绿,不會出現(xiàn)部分成功敛瓷,部分失敗的現(xiàn)象。
  • Consistency(一致性):事務在完成時斑匪,必須使所有的數(shù)據(jù)都保持一致狀態(tài)呐籽,在數(shù)據(jù)庫中所有的修改都基于事務,保證了數(shù)據(jù)的完整性蚀瘸,
  • Isolation(隔離性):可能多個應用程序線程同時訪問同一數(shù)據(jù)狡蝶,這樣數(shù)據(jù)庫同樣的數(shù)據(jù)在各個不同的事務中被訪問,這樣會產(chǎn)生丟失更新贮勃,為了壓制丟失更新的產(chǎn)生贪惹,數(shù)據(jù)庫定義了隔離級別的概念,通過它的選擇寂嘉,可以在不同程度上壓制數(shù)據(jù)丟失更新的產(chǎn)生奏瞬,因為互聯(lián)網(wǎng)的應用常常面對高并發(fā)的場景,所以隔離性是需要掌握的重點內容泉孩。
  • Durability(持久性):事務結束后硼端,所有的數(shù)據(jù)都會固定到一個地方,如保存到磁盤中寓搬,即使斷電重啟后也可以提供給應用程序訪問珍昨。
第一類丟失更新
時刻 事 務 1 事 務 2
T1 初始庫存100 初始庫存100
T2 扣減庫存,余99 ——
T3 —— 扣減庫存句喷,余99
T4 提交事務曼尊,庫存變?yōu)?9
T5 回滾事務,庫存100

可以看到脏嚷,T5時刻事務回滾骆撇,導致原本庫存為99的變?yōu)榱?00,顯然事務2的結果就丟失了父叙,這就是一個錯誤的值神郊,類似的,對于這樣一個事務提交而引發(fā)的數(shù)據(jù)不一致的情況趾唱,我們稱為第一類丟失更新涌乳。

第二類丟失
時刻 事 務 1 事 務 2
T1 初始庫存100 初始庫存100
T2 扣減庫存,余99 ——
T3 —— 扣減庫存甜癞,余99
T4 —— 提交事務夕晓,庫存為99
T5 提交事務,庫存變?yōu)?9 ——

注意在T5時刻提交的事務悠咱。因為在事務1中蒸辆,無法感知事務2 的操作征炼,這樣它就不知道事務2已經(jīng)做了修改,因此它依舊認為這只是發(fā)生了一筆業(yè)務躬贡,所以庫存更新變成了99谆奥,而這個結果又是一個錯誤的結果。這樣T5時刻事務1提交的事務拂玻,就會引發(fā)事務2提交結果的丟失酸些,我們把這樣的多個事務的提交引發(fā)丟失更新的稱為第二類丟失更新

為處理第二類丟失更新引發(fā)的錯誤檐蚜,提出了事務的隔離級別魄懂,常見的隔離級別有以下4種:

  • 未提交讀
  • 讀寫提交
  • 可重讀
  • 串行化
    下面我們來一一細說這四個隔離級別的作用
1.未提交讀

未提交讀(read uncommitted)是最低的得力級別,其含義是允許一個事務讀取另一個事務沒有提交的數(shù)據(jù)闯第。未提交讀是一種危險的隔離級別逢渔。所以我們一般在實際的開發(fā)中應用不廣,但是它的優(yōu)點在于并發(fā)能力高乡括,適合那些對數(shù)據(jù)一致性沒有要求而追求高并發(fā)的場景,它的最大壞處是出現(xiàn)臟讀智厌。

臟讀現(xiàn)象
時刻 事 務 1 事 務 2 備 注
T0 ....... ........ 商品庫存初始化為2
T1 讀取庫存為2
T2 扣減庫存 庫存為1
T3 扣減庫存 庫存為0诲泌,讀取事務1為提交的數(shù)據(jù)
T4 提交事務 庫存保存為0
T5 回滾事務 因為第一類丟失更新已經(jīng)克服,所以不會回滾為2铣鹏,庫存為0敷扫,結果錯誤

因為采用未提交讀,所以事務2可以讀取事務1為提交的庫存數(shù)據(jù)為1诚卸,這里當它扣減庫存后則數(shù)據(jù)為0葵第,然后它提交了事務,庫存就變成了0合溺,而事務1在T5時刻回滾事務卒密,因為第一類丟失更新已經(jīng)被克服,所以它不會將庫存回滾到2棠赛,那么最后的結果就變成了0哮奇,所以就出現(xiàn)了這樣的錯誤,臟讀一般是比較危險的隔離級別睛约,在我們實際應用中采用的不多鼎俘。

未待完續(xù),請持續(xù)關注~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末辩涝,一起剝皮案震驚了整個濱河市贸伐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怔揩,老刑警劉巖捉邢,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脯丝,死亡現(xiàn)場離奇詭異,居然都是意外死亡歌逢,警方通過查閱死者的電腦和手機巾钉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秘案,“玉大人砰苍,你說我怎么就攤上這事≮甯撸” “怎么了赚导?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赤惊。 經(jīng)常有香客問我吼旧,道長,這世上最難降的妖魔是什么未舟? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任圈暗,我火速辦了婚禮,結果婚禮上裕膀,老公的妹妹穿的比我還像新娘员串。我一直安慰自己,他們只是感情好昼扛,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布寸齐。 她就那樣靜靜地躺著,像睡著了一般抄谐。 火紅的嫁衣襯著肌膚如雪渺鹦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天蛹含,我揣著相機與錄音毅厚,去河邊找鬼。 笑死浦箱,一個胖子當著我的面吹牛卧斟,可吹牛的內容都是我干的。 我是一名探鬼主播憎茂,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼珍语,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了竖幔?” 一聲冷哼從身側響起板乙,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后募逞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛋铆,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年放接,在試婚紗的時候發(fā)現(xiàn)自己被綠了刺啦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡纠脾,死狀恐怖玛瘸,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情苟蹈,我是刑警寧澤糊渊,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站慧脱,受9級特大地震影響渺绒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜菱鸥,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一宗兼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氮采,春花似錦殷绍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殖侵。三九已至贸呢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拢军,已是汗流浹背楞陷。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茉唉,地道東北人固蛾。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像度陆,于是被迫代替她去往敵國和親艾凯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內容

  • 很多人喜歡這篇文章懂傀,特此同步過來 由淺入深談論spring事務 前言 這篇其實也要歸納到《常識》系列中趾诗,但這重點又...
    碼農(nóng)戲碼閱讀 4,722評論 2 59
  • 1.數(shù)據(jù)庫事務基礎知識 1.1.何為數(shù)據(jù)庫事務 數(shù)據(jù)庫事務的4個特性 原子性:組成一個事務的多個數(shù)據(jù)庫操作是一個不...
    小螺釘12138閱讀 1,563評論 1 18
  • 一、事務 1、事務四要素:ACID 對于事務恃泪,我之前的理解是很粗糙的郑兴,不就是為了保證操作的原子性么?一般訂單系統(tǒng)或...
    張偉科閱讀 1,285評論 0 5
  • 導語:計算機硬件在飛速發(fā)展贝乎,數(shù)據(jù)規(guī)模在急速膨脹情连,但是數(shù)據(jù)庫仍然使用是十年以前的架構體系,WiredTiger 嘗試...
    isgiker閱讀 3,404評論 0 7
  • 早上起來臉上長滿了痘痘览效,以前只會長在額頭和兩個嘴角下却舀,現(xiàn)在連臉上都長了,發(fā)信息問謝老師怎么回事朽肥,老師說多長幾次就不...
    黃泳儀閱讀 127評論 0 2