InnoDB行鎖,如何鎖住一條不存在的記錄?
《InnoDB,5項最佳實踐,知其所以然?》釋出後,不少同學留言希望講講MySQL的InnoDB行鎖機制。要細聊MySQL的行鎖,難以避免的要從事務的四種隔離級別說起。
四種隔離級別,又脫不開聊讀髒,不可重複讀,讀幻象等問題。
事務隔離級別,行鎖機制等都比較垂直,應用開發中大部分同學都用不到,不確定是否大部分朋友都感興趣。
今天,先丟擲一個問題,如果大家確定對這類話題感興趣的話,後續我花時間細聊這一系列問題。
MySQL預設的事務隔離級別是 Repeated Read (RR),假設使用的儲存引擎是InnoDB,在這個隔離級別下:
(1)讀取到資料,都是其他事務已提交的資料;
(2)同一個事務中,相同的連續
(3)不會出現insert幻象讀;
假設有資料表:
t(id int PK, name);
假設目前的記錄是:
10, shenjian
20, zhangsan
30, lisi
Case 1
事務A先執行,並且處於未提交狀態:
update t set name=’a’ where id=10;
事務B後執行:
update t set name=’b’ where id=10;
因為事務A在PK id=10上加了行鎖,因此事務B會阻塞。
Case 2
事務A先執行,並且處於未提交狀態:
delete from t where id=40;
事務A想要刪除一條不存在的記錄。
事務B後執行:
insert into t values(40, ‘c’);
事務B想要插入一條主鍵不衝突的記錄。
問題1:事務B是否阻塞?
問題2:如果事務B阻塞,鎖如何加在一條不存在的記錄上呢?
問題3:事務的隔離級別,索引型別,是否對問題1和問題2有影響呢?
如果大家對這些問題感興趣,後續我花時間深入梳理邏輯,畫圖細聊。
如果不感興趣,我換資料庫應用層架構的話題。
是不是很有意思的一個問題?
猜猜InnoDB的行鎖是怎麼做到的?
相關文章: