InnoDB 鎖機制

InnoDB 鎖機制

數(shù)據(jù)讀寫可能存在的問題

如果事情能順順利利的按照我們預(yù)想的那樣進行下去,世界將會多么美好。

  • 臟讀: 在一個事務(wù)A中讀取到另一個事務(wù)B未提交的數(shù)據(jù),事務(wù)B提交后A再讀數(shù)據(jù)又不一樣了
  • 不可重復(fù)讀: 針對同一條數(shù)據(jù),兩次查詢的結(jié)果不一致(update & delete)
  • 幻讀:兩次讀出來的數(shù)據(jù)數(shù)量不一致(insert)

臟讀和不可重復(fù)讀的區(qū)別在于:臟讀能讀到未提交的數(shù)據(jù),不可重復(fù)讀讀到了事務(wù)前后的數(shù)據(jù),兩者的表現(xiàn)都是針對同一條數(shù)據(jù),讀多次數(shù)據(jù)不一致。
不可重復(fù)讀和幻讀都是從數(shù)據(jù)一致性角度來看的,至于將數(shù)據(jù)修改操作和數(shù)據(jù)插入操作跟為兩種情況是因為解決這兩種情況的手段不一樣,下面會分析;

鎖種類

大類別上可以分為:

  • 表鎖
  • 行鎖:

從IO角度可以分為

  • 讀鎖
  • 寫鎖

表鎖會鎖住整個表的資源,性能很差,一般DDL操作會使用;大部分情況下對數(shù)據(jù)的操作都是行鎖,行鎖比較復(fù)雜,但是鎖住的數(shù)據(jù)少,對并發(fā)影響小,性能好,接下來主要討論行鎖。行鎖簡單點可以分為:

  • 共享鎖(讀鎖):共享鎖不會影響其他的讀操作;
  • 排他鎖(寫鎖):數(shù)據(jù)一旦有修改操作,鎖會升級為排他鎖,這時候其他事務(wù)不能讀,也不能修改這條數(shù)據(jù);需要注意的是,當(dāng)一個修改語句個where條件中沒有索引列時,這個鎖會變?yōu)楸礞i;

封鎖協(xié)議

一階段鎖協(xié)議

只開啟排他鎖不開啟共享鎖,排他鎖在事務(wù)結(jié)束后釋放

可以保證修改不丟失,會發(fā)生臟讀,因為沒有共享鎖,所以對于另外的事務(wù)而言,排他鎖不會影響到讀操作;

二階段鎖協(xié)議

在一階段基礎(chǔ)上開啟共享鎖,共享鎖在讀完數(shù)據(jù)后就釋放而不是事務(wù)結(jié)束后釋

保證修改不丟失的同時避免臟讀,因為有共享鎖,阻止自己讀取到其他事務(wù)中正在修改的數(shù)據(jù),從而避免臟讀;此時因為讀完數(shù)據(jù)就釋放,之后如果再有其他事務(wù)再一次對數(shù)據(jù)進行了修改并提交,在本事務(wù)中read就會出現(xiàn)不可重復(fù)讀現(xiàn)象;

三階段鎖協(xié)議

在二階段基礎(chǔ)上,共享鎖在事務(wù)結(jié)束后釋放而不是讀取完后就釋放

這個階段的手段是阻止后續(xù)的事務(wù)修改數(shù)據(jù),因為本事務(wù)在結(jié)束之前一直持有共享鎖,其他事務(wù)是獲取不到排他鎖的,從而實現(xiàn)可重復(fù)讀;

四階段鎖協(xié)議

這個最簡單,直接加表鎖,阻止其他事務(wù)所有操作,避免所有問題;

事務(wù)隔離級別

  • ReadUncommited
  • ReadCommited
  • RepeatableRead:
  • Serializable

這四種隔離級別看起來剛好跟上面的鎖協(xié)議對應(yīng),但是innodb 在此基礎(chǔ)上做了優(yōu)化(MVCC);

MVCC

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、MySQL鎖機制概述: (一)什么是鎖,以及為什么使用鎖和鎖的運作? 鎖是計算機協(xié)調(diào)多個進程或純線程并發(fā)訪問某...
    直到世界的盡頭_yifan閱讀 1,276評論 0 3
  • 1. 鎖類型 鎖是數(shù)據(jù)庫區(qū)別與文件系統(tǒng)的一個關(guān)鍵特性,鎖機制用于管理對共享資源的并發(fā)訪問。InnoDB使用的鎖類型...
    butterfly100閱讀 1,233評論 0 2
  • 當(dāng)一個系統(tǒng)訪問量上來的時候,不只是數(shù)據(jù)庫性能瓶頸問題了,數(shù)據(jù)庫數(shù)據(jù)安全也會浮現(xiàn),這時候合理使用數(shù)據(jù)庫鎖機制就顯得異...
    初來的雨天閱讀 3,687評論 0 22
  • 當(dāng)一個系統(tǒng)訪問量上來的時候,不只是數(shù)據(jù)庫性能瓶頸問題了,數(shù)據(jù)庫數(shù)據(jù)安全也會浮現(xiàn),這時候合理使用數(shù)據(jù)庫鎖機制就顯得異...
    JackFrost_fuzhu閱讀 7,947評論 4 83
  • InnoDB實現(xiàn)了兩種類型的行鎖。 共享鎖(S):允許一個事務(wù)去讀一行,阻止其他事務(wù)獲得相同的數(shù)據(jù)集的排他鎖。 排...
    琥珀灬閱讀 440評論 0 4

友情鏈接更多精彩內(nèi)容