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

mysql事務串行化的鎖機制是怎樣的

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

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

回答
編輯回答
做不到

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

實際項目中,這個級別的隔離很少用(我從來沒在實際項目中用過)。因為并發(fā)性能低,容易死鎖,最常用的還是缺省的REPEATABLE READ或是READ COMMITTED。

2017年5月1日 06:21