主要內(nèi)容:
- 事務(wù)概念
- 事務(wù)特性
- 事務(wù)不一致性問題
說到數(shù)據(jù)庫贫母,大家就會想到事務(wù)盒刚。對于事務(wù)來說,會想到事務(wù)的特性ACID以及不一致性問題橘原,這里深入講解下這兩點涡上。
事務(wù)
說事務(wù)特性之前,思考下什么是事務(wù)呢吩愧?事務(wù)其實就是一組相互依賴的操作序列,那么事務(wù)的成功意味著這些操作行為都要成功執(zhí)行脐帝,如果有一個行為失敗,整個事務(wù)也是失敗的堵腹。舉個最常見的例子銀行轉(zhuǎn)賬業(yè)務(wù),A向B賬戶轉(zhuǎn)賬100元旱易,這個事務(wù)分為兩個操作行為:操作1——A賬戶減少100元腿堤,操作2——B賬戶增加100元。
事務(wù)特性
原子性
高中物理說過笆檀,原子是化學(xué)反應(yīng)中不可分割的基本微粒。事務(wù)的原子性呢浸船,就是事務(wù)中的操作行為是不可分割的工作單元寝蹈,這些操作要么全部操作成功事務(wù)成功,要么某個行為失敗事務(wù)回滾箫老。
用例子來說明,如果轉(zhuǎn)賬過程中A賬戶減少了100元操作成功阔籽,但是往B賬戶增加100元操作失敗牲蜀,那么這個事務(wù)是失敗的,回滾到最初狀態(tài)涣达,即要么全部失敗。
一致性
事務(wù)的一致性指事務(wù)執(zhí)行之前和執(zhí)行之后必須處于一致性狀態(tài)匆篓,這樣說比較難懂寇窑。
舉例子來說明,A和B賬戶總金額為1000元錢甩骏,那么A向B賬戶轉(zhuǎn)賬事務(wù)執(zhí)行成功以后先慷,A和B賬戶的總金額還是1000元錢谨设。
隔離性
隔離性指一個事務(wù)的操作以及用到的數(shù)據(jù)對其他并發(fā)的事務(wù)是隔離的缎浇,并發(fā)執(zhí)行的各個事務(wù)之間互不干擾。即使多個事務(wù)并發(fā)執(zhí)行二蓝,看上去的效果是多個成功事務(wù)串行調(diào)度執(zhí)行指厌,事務(wù)感覺不到其他并發(fā)事務(wù)的執(zhí)行。
舉個例子踩验,例如兩個并發(fā)的事務(wù)T1和T2,從T1角度看牡借,T2要么在它執(zhí)行之前已經(jīng)結(jié)束袭异,要么在它執(zhí)行完成后才開始。
持久性
持久性指的是如果一個事務(wù)被提交了御铃,那么事務(wù)對數(shù)據(jù)庫所做的修改是持久的,系統(tǒng)崩潰或者機(jī)器故障對它都是不會產(chǎn)生影響的咬腋。
比如例子中如果A向B賬戶轉(zhuǎn)賬成功以后睡互,那么這個轉(zhuǎn)賬記錄就會保存,不用擔(dān)心丟失這個記錄犀填。
事務(wù)的不一致性
事務(wù)是并發(fā)控制的基本單位嗓违,如果多個線程都開啟事務(wù)操作數(shù)據(jù)庫中的相同數(shù)據(jù)時,如果沒有采取隔離性措施蹂季,那么可能會造成數(shù)據(jù)的不一致性疏日。并發(fā)操作帶來的數(shù)據(jù)不一致性問題主要分為四類撒汉,接下來具體介紹下這四類。
丟失更新
多個事務(wù)獲取同一個數(shù)據(jù)挠阁,并且都基于原始數(shù)據(jù)進(jìn)行更新溯饵,而每個事務(wù)都不知道其他事務(wù)的存在,所以最后的更新將會覆蓋其他事務(wù)的更新操作丰刊。
舉訂票操作來說明,
- t1時刻事務(wù)T1中A售票員查詢某一班車的剩余票數(shù)D為10寻歧;
- t2時刻事務(wù)T2中B售票員查詢同一班車的剩余票數(shù)D也為10秩仆;
- t3時刻事務(wù)T1售票員A賣出一張票,剩余票數(shù)D修改為9逗概,寫入數(shù)據(jù)庫;
- t4時刻事務(wù)T2售票員B也賣出一張票卿城,因為t2時刻讀取到的剩余票數(shù)為10铅搓,修改為9并寫入數(shù)據(jù)庫。最后結(jié)果為9多望,但其實是賣出了兩張票氢烘,事務(wù)T2的修改覆蓋了事務(wù)T1的修改,即丟失更新問題播玖。
臟讀
臟讀指事務(wù)獲取到了臟數(shù)據(jù),具體說是一個事務(wù)讀取到了另一個未提交事務(wù)中的數(shù)據(jù)维蒙。
舉發(fā)工資的例子來說明,
- 事務(wù)T1開始颅痊,hr給李四發(fā)5000元工資,但還沒有提交事務(wù)菱属。
- 這時候事務(wù)T2李四查看自己工資恋捆,發(fā)現(xiàn)有5000元重绷,激動人心。
- 但事務(wù)T1中hr發(fā)現(xiàn)工資計算錯誤愤钾,工資應(yīng)該是4000元候醒,回滾了事務(wù)。那么事務(wù)T2李四讀取到的數(shù)據(jù)和數(shù)據(jù)庫中數(shù)據(jù)是不一致倒淫,即所謂的臟數(shù)據(jù)。
不可重復(fù)讀
對于某個數(shù)據(jù)镜硕,一個事務(wù)范圍內(nèi)多次查詢該數(shù)據(jù)獲得了不同的返回結(jié)果返干。即事務(wù)T1包含多次查詢操作,第一次讀取數(shù)據(jù)后矩欠,在事務(wù)T1時間范圍內(nèi)事務(wù)T2對該數(shù)據(jù)進(jìn)行修改并提交,下一個操作再次查詢該數(shù)據(jù)躺坟,就會得到和第一次不同的結(jié)果乳蓄。
幻讀
一個事務(wù)在提交查詢結(jié)果前,另一個事務(wù)對數(shù)據(jù)進(jìn)行了修改導(dǎo)致了該查詢結(jié)果的更改匣摘,產(chǎn)生了幻讀。
- 事務(wù)T1音榜,李四查詢這個月信用卡總共消費筆數(shù),但沒有提交查詢結(jié)果擦囊。
- 事務(wù)T2張三使用這個信用卡消費了新的一筆交易嘴办。
- 這時候事務(wù)T1再次查詢消費筆數(shù)發(fā)現(xiàn)筆數(shù)增加,產(chǎn)生了幻覺涧郊。
比較
可以發(fā)現(xiàn)幻讀和不可重復(fù)讀都是讀取了已提交事務(wù)的數(shù)據(jù),而不可重復(fù)讀針對的是同一條數(shù)據(jù)彤灶,幻讀針對一批數(shù)據(jù)(例如統(tǒng)計數(shù)據(jù)的個數(shù))批旺。