1. 程式人生 > >InnoDB行鎖,如何鎖住一條不存在的記錄?

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的行鎖是怎麼做到的?

相關文章: