事務(wù)的四個(gè)隔離等級(jí)

1 read uncommitted

設(shè)置隔離等級(jí)為未提交讀。

mysql> set session transaction isolation level read uncommitted;

當(dāng)線程A開(kāi)啟事務(wù)A后更新表中的數(shù)據(jù),在未提交的情況下,
線程B開(kāi)啟的事務(wù)B可以訪問(wèn)到事務(wù)A的未提交結(jié)果,
則稱之為未提交讀隔離等級(jí)。

2 read committed

設(shè)置隔離等級(jí)為提交讀

mysql> set session transaction isolation level read committed;

當(dāng)線程A開(kāi)啟事務(wù)A后更新表,在未提交的情況下,
線程B開(kāi)啟的事務(wù)B是無(wú)法訪問(wèn)到事務(wù)A中的更新的。
在事務(wù)A執(zhí)行commit之后,事務(wù)B即可訪問(wèn)到事務(wù)A中的更新。

3 repeatable read

設(shè)置隔離等級(jí)為可重復(fù)讀。

mysql> set session transaction isolation level repeatable read;

當(dāng)線程A開(kāi)啟事務(wù)A后,保持事務(wù)A的連接。
此時(shí)線程B開(kāi)啟事務(wù)B并且插入了新數(shù)據(jù)并提交。
事務(wù)A此時(shí)執(zhí)行select語(yǔ)句是無(wú)法訪問(wèn)到事務(wù)B所提交的數(shù)據(jù)的,
同時(shí)如果事務(wù)A此時(shí)insert了和事務(wù)B相同的數(shù)據(jù),數(shù)據(jù)庫(kù)會(huì)報(bào)錯(cuò)提示主鍵沖突。

就好像事務(wù)A產(chǎn)生了幻覺(jué)一樣。這種場(chǎng)景我們稱之為幻讀

可重復(fù)讀正如字面意思所示,事務(wù)A在執(zhí)行多次select操作的時(shí)候,
不會(huì)受到其他事務(wù)的影響可以重復(fù)獲取相同的數(shù)據(jù)。

4 serializable

設(shè)置隔離等級(jí)為可串行化。

mysql> set session transaction isolation level serializable;

這是隔離中的最高等級(jí),也是一把雙刃劍??梢苑乐股鲜龅?code>幻讀,方法就是給行加鎖。

簡(jiǎn)單來(lái)說(shuō),
線程A開(kāi)啟事務(wù)A后在未進(jìn)行操作的情況下,
線程B開(kāi)啟了事務(wù)B并且執(zhí)行insert操作給表(user)增加了一行數(shù)據(jù),
事務(wù)A在select表(user)的時(shí)候操作會(huì)被掛起,
直到事務(wù)B提交之后,事務(wù)A的select操作才會(huì)被執(zhí)行。

也就是說(shuō)事務(wù)B在執(zhí)行insert操作后給表的新增行上了鎖,
事務(wù)A在訪問(wèn)相同表的時(shí)候由于事務(wù)B仍然持有鎖,
事務(wù)A必須等待事務(wù)B釋放鎖后(rollback或者commit)才可以操作該表。

由于鎖的粒度是行等級(jí)的,這也就意味著如果事務(wù)B對(duì)表(user)的第10行進(jìn)行了更新操作,在未提交的情況下,
事務(wù)A是可以訪問(wèn)到表(user)除了第10行以外的數(shù)據(jù)的。
如果select語(yǔ)句中包含了對(duì)第10行的訪問(wèn)或者操作,則將會(huì)被掛起。

總結(jié)

MySQL默認(rèn)是可重復(fù)讀隔離等級(jí)。

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

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

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