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í)。