鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)  網(wǎng)絡(luò)安全/ mysql事務(wù)串行化的鎖機(jī)制是怎樣的

mysql事務(wù)串行化的鎖機(jī)制是怎樣的

mysql事務(wù) 串行化 隔離級(jí)別的鎖機(jī)制是怎樣的
在A、B客戶(hù)端都開(kāi)啟事務(wù),假如
① 如果A事務(wù)刪除某條記錄(尚未提交回滾),B事務(wù)無(wú)法讀取A事務(wù)中刪除且未提交的事務(wù),這是因?yàn)锳事務(wù)中加了寫(xiě)鎖
② 如果A事務(wù)插入了一條數(shù)據(jù)(假如ID為4),那么B事務(wù)中,ID = 1、2、3都可以正常讀,但是
select * from account where id <= 3;
就會(huì)等待,不太理解,望不吝賜教、謝謝諸位

參考資料:
① MySQL高性能中提到:串行化會(huì)在讀取的每一行數(shù)據(jù)上都加鎖(這個(gè)意思是部分鎖,但不會(huì)鎖表)
https://tech.meituan.com/inno...
這里提到:串行讀(Serializable):完全串行化的讀,每次讀都需要獲得表級(jí)共享鎖,讀寫(xiě)相互都會(huì)阻塞
這意思是鎖表了,到底是鎖表還是鎖某些記錄
③ 共享鎖為什么還會(huì)相互阻塞

回答
編輯回答
做不到

隔離機(jī)制比較復(fù)雜,而且不同的數(shù)據(jù)庫(kù)還不一致,你的問(wèn)題是基于MySQL的Innodb,我的理解是這樣的:
Serializable隔離在每次訪(fǎng)問(wèn)記錄的時(shí)候(無(wú)論讀寫(xiě)),都會(huì)鎖記錄,所以導(dǎo)致了你說(shuō)的問(wèn)題,雖然你加了條件id<=3,但還是需要遍歷到每條記錄,才能給出select結(jié)果,所以依然會(huì)被鎖。

實(shí)際項(xiàng)目中,這個(gè)級(jí)別的隔離很少用(我從來(lái)沒(méi)在實(shí)際項(xiàng)目中用過(guò))。因?yàn)椴l(fā)性能低,容易死鎖,最常用的還是缺省的REPEATABLE READ或是READ COMMITTED。

2017年5月1日 06:21