一兆旬、事務(wù)
事務(wù)是數(shù)據(jù)庫管理系統(tǒng)執(zhí)行過程中的一個邏輯單位,由一個有限的數(shù)據(jù)庫操作序列構(gòu)成怎栽。–摘自百科
在MySQL里爵憎,事務(wù)是在引擎層面實現(xiàn),比如MyIsam不支持婚瓜,InnoDB支持
二宝鼓、ACID
提到事務(wù),肯定會想到 ACID 是吧巴刻,自行感受一下概念愚铡,然后我們來講講隔離性的問題。
原子性( Atomicity):事務(wù)的所有操作要么全部成功胡陪,要么全部回滾沥寥。
一致性( Consistency):總是從一個一致性的狀態(tài)轉(zhuǎn)換到另一個一致性的狀態(tài)。
隔離性( Isolation):多個事務(wù)并發(fā)執(zhí)行時柠座,一個事務(wù)的執(zhí)行不應(yīng)影響其他事務(wù)的執(zhí)行
持久性( Durability):已被提交的事務(wù)對數(shù)據(jù)庫的修改應(yīng)該永久保存在數(shù)據(jù)庫中邑雅。
三、隔離級別
臟讀妈经、 幻讀淮野、 不可重復(fù)讀,做了多年的 CRUDer吹泡,對這幾個詞真是不陌生骤星,要不是出去面試,也真不會去了解爆哑。希望大家看完之后洞难,面試的時候,不要慌揭朝,跟他剛队贱。
實際上色冀,這些場景都是出現(xiàn)在多個事務(wù)同時執(zhí)行時的場景。
3.1 臟讀(Read Uncommitted)
通俗的講柱嫌,一個事務(wù)在處理過程中讀取了另外一個事務(wù)未提交的數(shù)據(jù)呐伞。
你都還沒提交,我就讀到了你剛操作的數(shù)據(jù)慎式,萬一你回滾了怎么辦伶氢,你說這臟不臟。
舉例:
假設(shè)打賞的邏輯是:① 我的賬戶+1元瘪吏;② 你的賬戶-1元癣防。
當你執(zhí)行到第一個步驟,我去查詢我的賬戶已經(jīng)是2元了掌眠,很開心@俣ⅰ!蓝丙!宣布請大家去擼串<对狻!渺尘!但是最后扣款的時候發(fā)現(xiàn)你余額不足了挫鸽,回滾了,我的1元沒了鸥跟,就很難受6肌!
3.2 不可重復(fù)讀(Non-repeatable Read)
通俗的講医咨,一個事務(wù)范圍內(nèi)枫匾,多次查詢某個數(shù)據(jù),卻得到不同的結(jié)果拟淮。
與臟讀的區(qū)別:臟讀是讀到未提交的數(shù)據(jù)干茉,而不可重復(fù)讀讀到的卻是已經(jīng)提交的數(shù)據(jù),但實際上是違反了事務(wù)的一致性原則很泊。
舉例:
假設(shè)我查了下賬戶余額角虫,看到你們給小編打賞了1塊錢,很開心3虐觥I弦!搏屑!宣布請大家去擼串U俊!辣恋!在付款之前亮垫,錢被另外一個人取走模软,又查詢到?jīng)]錢了,被留下來洗碗了R省H家臁!
因為我查詢完后继蜡,這條數(shù)據(jù)沒鎖住回俐,又被別的事務(wù)更新了,導(dǎo)致當前事務(wù)每次都是讀到最新的數(shù)據(jù)稀并。
3.3 幻讀
在Repeatable Read隔離級別下仅颇,一個事務(wù)可能會遇到幻讀(Phantom Read)的問題。
事務(wù)A讀取與搜索條件相匹配的若干行碘举。事務(wù)B以插入或刪除行等方式來修改事務(wù)A的結(jié)果集忘瓦,然后再提交。
舉例:
看到了嗎引颈,在一個事務(wù)A中耕皮,第一次查詢某條記錄,是沒有的蝙场,但是凌停,當試圖更新這條不存在的記錄時,竟然能成功售滤,并且苦锨,再次讀取同一條記錄,它就神奇地出現(xiàn)了趴泌。
實際上舟舒,在InnoDB引擎中,對于索引的掃描嗜憔,不僅鎖住掃描到的索引秃励,而且還鎖住這些索引覆蓋的范圍(gap),因此這個范圍是內(nèi)插入數(shù)據(jù)是不允許的
https://blog.csdn.net/lonely_bin/article/details/96175384