最近在看行鎖時發現大家提到間隙鎖都說是事務間不互斥的,同時因為不互斥還容易導致死鎖。
但是我自己測驗時,老感覺有時互斥有時不互斥,下面給出一個我認為互斥的例子:
表結構和資料:


# 事務A先執行
BEGIN;
SELECT id FROM test_lock WHERE id >2 and id <= 3 FOR UPDATE;
-- ROLLBACK; #未提交
# 事務B后執行
BEGIN;
SELECT id FROM test_lock WHERE id >2 and id <= 3 FOR UPDATE; #事務B阻塞在此處
ROLLBACK;
對于表test_lock來說,事務A用臨鍵鎖(next key lock)鎖住了(1, 5]區間,事務B應該也鎖住同個區間。
如果間隙鎖是不互斥的,為何事務B在執行時會發生阻塞呢?
感覺認知上肯定哪里出了問題,自己一個人想實在想不明白,希望大佬們幫忙指出錯誤!
uj5u.com熱心網友回復:
下面再給出不互斥的例子:
# 事務A
BEGIN;
SELECT id FROM test_lock WHERE id= 3 FOR UPDATE;
# 事務B
BEGIN;
SELECT id FROM test_lock WHERE id= 3 FOR UPDATE; # 不會阻塞
ROLLBACK;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/267671.html
標籤:MySQL
上一篇:PG資料插入資料報錯
