Mysql InnoDB下事物并發(fā)的理解

什么是事物:

? ? ? ?因?yàn)闃I(yè)務(wù)的需要,mysql需要引入事物的概念(此概念不做具體介紹)

事物并發(fā)產(chǎn)生的問題 :

? ? ? ?事物并發(fā)執(zhí)行的時(shí)候會產(chǎn)生一些問題,如下

? ? ? ?臟讀:一個(gè)事物讀取到了例外一個(gè)事物沒有提交的數(shù)據(jù),如何此時(shí)例外一個(gè)事物回滾, 相當(dāng)于讀取到了臟數(shù)據(jù)

? ? ? ?不可重復(fù)讀:一個(gè)事物在讀取過程中 讀取到了其他事物修改的數(shù)據(jù),導(dǎo)致多次數(shù)據(jù)讀取不一致

? ? ? ?幻讀:一個(gè)事物在讀取過程中 讀取到了其他事物新增的數(shù)據(jù),導(dǎo)致多次數(shù)據(jù)讀取不一致

?解決方案:

? ? ? ? 一:可以通過加鎖的方式來解決上述問題,例如,讀的時(shí)候加共享鎖,此時(shí)其他事物無法修改相應(yīng)的數(shù)據(jù),寫的時(shí)候加排他鎖

禁止其他事物讀寫操作,但是這種做法性能較差

? ? ?二:基于性能的考慮 mysql?InnoDB引擎實(shí)現(xiàn)了 多版本并發(fā)控制(MVCC),這是一種樂觀鎖的實(shí)現(xiàn)方式;MVCC 在讀已提交 和 可重復(fù)讀 2種隔離級別下工作;

? ? ? ? ? ?在MVCC中,讀操作可以分成兩類,快照讀(Snapshot read)和當(dāng)前讀(current read)??煺兆x,讀取的是記錄的可見版本(可能是歷史版本,即最新的數(shù)據(jù)可能正在被當(dāng)前執(zhí)行的事務(wù)并發(fā)修改),不會對返回的記錄加鎖;而當(dāng)前讀,讀取的是記錄的最新版本,并且會對返回的記錄加鎖,保證其他事務(wù)不會并發(fā)修改這條記錄,所以說MVCC解決了不可重復(fù)讀的問題,因?yàn)楫?dāng)前讀讀取的是最新的版本,所以還是會出現(xiàn)幻讀的情況,

? ? ? ? ? Mysql通過間隙鎖的方式解決了 幻讀 的問題,一種鎖定索引記錄間隙,確保索引記錄的間隙不變的加鎖方式,間隙鎖僅發(fā)生于檢索條件有非唯一索引,RR級別下;唯一索引下 由于其唯一性,排序性沒有間隙





? ? ? ?

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

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

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