事務(wù)并發(fā)問題及解決方案

并發(fā)有三種場景:讀-讀,讀-寫,寫-寫

1、讀-寫,寫-寫則會(huì)發(fā)生事務(wù)并發(fā)問題(更新丟失,數(shù)據(jù)進(jìn)行了覆蓋、臟讀、不可重復(fù)讀、幻讀)

具體請看上篇并發(fā)問題

2、mvcc和鎖機(jī)制進(jìn)行解決

mvcc:多版本并發(fā)控制(可以無鎖進(jìn)行解決,讀-寫問題)

實(shí)現(xiàn)原理:由三個(gè)數(shù)據(jù)表行隱藏字段,undo.log,readView來實(shí)現(xiàn)的

隱藏字段:事務(wù)id(DB_TRX_ID )最近添加或修改的事務(wù)id,回滾指針(DB_ROLL_PTR)指向這條記錄的上個(gè)版本(儲(chǔ)存在rollback segment),隱藏主鍵(DB_ROW_ID )(當(dāng)表中沒有設(shè)置主鍵時(shí)innodb會(huì)以隱藏主鍵設(shè)置一個(gè)聚簇索引)

undo.log:對每一行數(shù)據(jù)的操作都會(huì)記錄其中,方便回滾數(shù)據(jù),insert操作的歷史記錄會(huì)在回滾后進(jìn)行刪除,修改和刪除不會(huì)立馬刪除,會(huì)等到?jīng)]有事務(wù)使用該行數(shù)據(jù)才會(huì)刪除。沒刪除時(shí)可以用來進(jìn)行快照讀。當(dāng)多個(gè)事務(wù)操作該行數(shù)據(jù)時(shí)則會(huì)形成版本鏈表。

readView:每一個(gè)事務(wù)的快照讀結(jié)果所形成的readView,(事務(wù)的數(shù)據(jù)可見性判斷方法):通過事務(wù)id進(jìn)行比較,然后得到可以讀到的最新版本或最新舊版本(判斷方式以當(dāng)前事務(wù)id去進(jìn)行查詢,如果該id大于未提交的事務(wù)中最小的事務(wù)id,再比較活躍事務(wù)中最大的事務(wù)id,當(dāng)小于該事務(wù)id時(shí)再比較是否在未提交(活躍)的事務(wù)中,不在則該事務(wù)記錄為最新可見版本。如果在比較的過程中不符合條件則取符合條件的最新舊版本)

readView,在讀已提交和可重復(fù)讀的隔離級別有稍微的區(qū)別。

讀已提交級別下的機(jī)制:根據(jù)每一次的快照讀都會(huì)生成一個(gè)readView,所以可以查看到別的事務(wù)中的已提交的數(shù)據(jù)

可重復(fù)讀級別下的機(jī)制:只有事務(wù)第一次快照讀的時(shí)候才會(huì)生成readView,所以查不到之后事務(wù)提交的數(shù)據(jù)。

鎖的解決方案:

? ? 表鎖:s,x,意向鎖(鎖升級情況下會(huì)自動(dòng)升級成表鎖),元數(shù)據(jù)鎖(增刪改查時(shí)加MDL讀鎖,修改數(shù)據(jù)表結(jié)構(gòu)加MDL寫鎖)

LOCK TABLE XXX READ

LOCK TABLE XXX WRITE

行鎖:

????共享鎖:lock in share mode

? ? 排他鎖:for update

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

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

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