數(shù)據(jù)庫事務(wù)和spring事務(wù)

事務(wù)

事務(wù)特性

事務(wù)(Transaction)是由一系列對系統(tǒng)中數(shù)據(jù)進行訪問與更新的操作所組成的一個程序 執(zhí)行邏輯單元(Unit)津滞。事務(wù)具有四個特征,分別是原子性(Atomicity )、一致性(Consistency )、隔離性(Isolation) 和持久性(Durability),簡稱為事務(wù)的ACID特性。

  • 原子性(Atomicity):原子性是指事務(wù)是一個不可分割的工作單位驱负,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生患雇。
  • 一致性(Consistency):事務(wù)執(zhí)行前后數(shù)據(jù)的完整性必須保持一致跃脊。比如在轉(zhuǎn)賬事務(wù)操作中,事務(wù)執(zhí)行前后金額的總數(shù)應(yīng)保持不變庆亡。
  • 隔離性(Isolation):事務(wù)的隔離性是多個用戶并發(fā)訪問數(shù)據(jù)庫時匾乓,數(shù)據(jù)庫為每一個用戶開啟的事務(wù)捞稿,不能被其他事務(wù)的操作數(shù)據(jù)所干擾又谋,多個并發(fā)事務(wù)之間要相互隔離。
  • 持久性(Durability):持久性是指一個事務(wù)一旦被提交娱局,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的彰亥,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。

事務(wù)并發(fā)執(zhí)行帶來的問題

  • 1.丟失修改(丟失更新):兩個事務(wù)T1和T2讀入同一數(shù)據(jù)并修改衰齐,T2的提交結(jié)果破壞了T1提交的結(jié)果任斋,導致T1的修改被丟失。

  • 2.不可重復讀:事務(wù)T1讀取某一數(shù)據(jù)后耻涛,事務(wù)T2對其做了修改废酷,當事務(wù)T1再次讀該數(shù)據(jù)時瘟檩,得到與前一次不同的值。

  • 3.幻讀:事務(wù)T1按一定條件從數(shù)據(jù)庫中讀取了某些數(shù)據(jù)記錄后澈蟆,事務(wù)T2刪除了其中部分記錄墨辛,當T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)某些記錄消失了趴俘;或者說事務(wù)T2插入了部分新記錄睹簇,當T1再次按相同條件讀取數(shù)據(jù)時,發(fā)現(xiàn)多出來了部分數(shù)據(jù)寥闪。
    注意:幻讀和不可重復讀的主要區(qū)別在于:
    幻讀針對的是查詢結(jié)果為多個的場景太惠,出現(xiàn)了數(shù)據(jù)的增加 or 減少
    不可重復度讀對的是某些特定的記錄,這些記錄的數(shù)據(jù)與之前不一致

  • 4.讀“臟”數(shù)據(jù):事務(wù)T1修改某一數(shù)據(jù)后疲憋,事務(wù)T2讀取同一數(shù)據(jù)凿渊,然后T1由于某種原因操作被撤銷(回滾),這時T1已修改過的數(shù)據(jù)恢復原值缚柳,T2讀到的數(shù)據(jù)就與數(shù)據(jù)庫中的真實數(shù)據(jù)不一致嗽元,這時T2讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即不正確的數(shù)據(jù)喂击。

隔離級別

在標準SQL規(guī)范中剂癌,定義了4個事務(wù)隔離級別,不同的隔離級別對事務(wù)的處理不同翰绊,分別是:未授權(quán)讀取佩谷,授權(quán)讀取,可重復讀取和串行化


隔離級別
性能關(guān)系圖

傳播性

事務(wù)的傳播性

springBoot中的事務(wù)

SpringBoot中的事務(wù)控制

  • Spring提供了一個@EnableTransactionManagement注解在配置類上來開啟聲明式事務(wù)的支持(開啟注解支持)监嗜。使用了@EnableTransactionManagement后谐檀,Spring容器會自動掃描注解@Transactional的方法和類。SpringBoot默認已開啟裁奇,可不用顯式注解桐猬。
  • 要使用事務(wù),我們只需要在需要事務(wù)的類或方法上使用@Transactional 注解即可刽肠,當注解在類上的時候意味著此類的所有public方法都是開啟事務(wù)的溃肪。被注解的方法都成為一個事務(wù)整體,同一個事務(wù)內(nèi)共享一個數(shù)據(jù)庫連接音五,所有操作同時發(fā)生惫撰。如果在事務(wù)內(nèi)部執(zhí)行過程中發(fā)生了異常,則事務(wù)整體會自動進行回滾躺涝。
    SpringBoot中的事務(wù)_阿阿阿安的博客-CSDN博客_springboot事務(wù)

spring中的事務(wù)

Spring事務(wù)傳播屬性(Propagation厨钻,7種傳播行為):

    1. REQUIRED(默認屬性)
      如果存在一個事務(wù),則支持當前事務(wù)。如果沒有事務(wù)則開啟一個新的事務(wù)夯膀。
      被設(shè)置成這個級別時诗充,會為每一個被調(diào)用的方法創(chuàng)建一個邏輯事務(wù)域。如果前面的方法已經(jīng)創(chuàng)建了事務(wù)诱建,那么后面的方法支持當前的事務(wù)其障,如果當前沒有事務(wù)會重新建立事務(wù)。
    1. MANDATORY
      支持當前事務(wù)涂佃,如果當前沒有事務(wù)励翼,就拋出異常。
    1. NEVER
      以非事務(wù)方式執(zhí)行辜荠,如果當前存在事務(wù)汽抚,則拋出異常。
    1. NOT_SUPPORTED
      以非事務(wù)方式執(zhí)行操作伯病,如果當前存在事務(wù)造烁,就把當前事務(wù)掛起。
    1. REQUIRES_NEW
      新建事務(wù)午笛,如果當前存在事務(wù)惭蟋,把當前事務(wù)掛起。
    1. SUPPORTS
      支持當前事務(wù)药磺,如果當前沒有事務(wù)告组,就以非事務(wù)方式執(zhí)行。
    1. NESTED
      支持當前事務(wù)癌佩,新增Savepoint點木缝,與當前事務(wù)同步提交或回滾。
      嵌套事務(wù)一個非常重要的概念就是內(nèi)層事務(wù)依賴于外層事務(wù)围辙。外層事務(wù)失敗時我碟,會回滾內(nèi)層事務(wù)所做的動作。而內(nèi)層事務(wù)操作失敗并不會引起外層事務(wù)的回滾姚建。

2.隔離級別:(5種隔離級別)Spring對數(shù)據(jù)庫來說隔離級別只有4種矫俺,不包括默認級別

    1. DEFAULT (默認)
      這是一個PlatfromTransactionManager默認的隔離級別,使用數(shù)據(jù)庫默認的事務(wù)隔離級別掸冤。另外四個與JDBC的隔離級別相對應(yīng)厘托。
    1. READ_UNCOMMITTED (讀未提交)
      這是事務(wù)最低的隔離級別,它允許另外一個事務(wù)可以看到這個事務(wù)未提交的數(shù)據(jù)贩虾。這種隔離級別會產(chǎn)生臟讀催烘,不可重復讀和幻像讀。
    1. READ_COMMITTED (讀已提交)
      保證一個事務(wù)修改的數(shù)據(jù)提交后才能被另外一個事務(wù)讀取缎罢,另外一個事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。這種事務(wù)隔離級別可以避免臟讀出現(xiàn),但是可能會出現(xiàn)不可重復讀和幻像讀策精。
    1. REPEATABLE_READ (可重復讀)
      這種事務(wù)隔離級別可以防止臟讀舰始、不可重復讀,但是可能出現(xiàn)幻像讀咽袜。它除了保證一個事務(wù)不能讀取另一個事務(wù)未提交的數(shù)據(jù)外丸卷,還保證了不可重復讀
    1. SERIALIZABLE(串行化)
      這是花費最高代價但是最可靠的事務(wù)隔離級別,事務(wù)被處理為順序執(zhí)行询刹。除了防止臟讀谜嫉、不可重復讀外,還避免了幻像讀凹联。

spring的事務(wù)與數(shù)據(jù)庫的事務(wù)是否一樣沐兰?

本質(zhì)上其實是同一個概念,spring的事務(wù)是對數(shù)據(jù)庫的事務(wù)的封裝,最后本質(zhì)的實現(xiàn)還是在數(shù)據(jù)庫,假如數(shù)據(jù)庫不支持事務(wù)的話,spring的事務(wù)是沒有作用的.數(shù)據(jù)庫的事務(wù)說簡單就只有開啟,回滾和關(guān)閉,spring對數(shù)據(jù)庫事務(wù)的包裝,原理就是拿一個數(shù)據(jù)連接,根據(jù)spring的事務(wù)配置,操作這個數(shù)據(jù)連接對數(shù)據(jù)庫進行事務(wù)開啟,回滾或關(guān)閉操作.但是spring除了實現(xiàn)這些,還配合spring的傳播行為對事務(wù)進行了更廣泛的管理.其實這里還有個重要的點,那就是事務(wù)中涉及的隔離級別,以及spring如何對數(shù)據(jù)庫的隔離級別進行封裝.事務(wù)與隔離級別放在一起理解會更好些

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蔽挠,隨后出現(xiàn)的幾起案子住闯,更是在濱河造成了極大的恐慌,老刑警劉巖澳淑,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件比原,死亡現(xiàn)場離奇詭異,居然都是意外死亡杠巡,警方通過查閱死者的電腦和手機量窘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氢拥,“玉大人绑改,你說我怎么就攤上這事⌒忠唬” “怎么了厘线?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長出革。 經(jīng)常有香客問我造壮,道長,這世上最難降的妖魔是什么骂束? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任耳璧,我火速辦了婚禮,結(jié)果婚禮上展箱,老公的妹妹穿的比我還像新娘旨枯。我一直安慰自己,他們只是感情好混驰,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布攀隔。 她就那樣靜靜地躺著皂贩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昆汹。 梳的紋絲不亂的頭發(fā)上明刷,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音满粗,去河邊找鬼辈末。 笑死,一個胖子當著我的面吹牛映皆,可吹牛的內(nèi)容都是我干的挤聘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼捅彻,長吁一口氣:“原來是場噩夢啊……” “哼组去!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沟饥,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤添怔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贤旷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體广料,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年幼驶,在試婚紗的時候發(fā)現(xiàn)自己被綠了艾杏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡盅藻,死狀恐怖购桑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氏淑,我是刑警寧澤勃蜘,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站假残,受9級特大地震影響缭贡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辉懒,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一阳惹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眶俩,春花似錦莹汤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抹竹。三九已至,卻和暖如春荒勇,著一層夾襖步出監(jiān)牢的瞬間柒莉,已是汗流浹背闻坚。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工沽翔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窿凤。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓仅偎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雳殊。 傳聞我的和親對象是個殘疾皇子橘沥,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容