MySQL唯一索引間隙鎖是指在使用唯一索引時,在索引在兩個值之間的間隙中,MySQL會自動為該間隙加鎖,以防止其他事務的插入操作,同時也會保證并發的訪問。
CREATE TABLE `test`( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上述代碼用于創建一張表test,其中id為主鍵,name為唯一索引。
START TRANSACTION; INSERT INTO test (name, age) VALUES ("Tom", 21); COMMIT;
在事務中執行上述INSERT語句,這時候MySQL會自動加鎖該唯一索引的間隙。如果在此期間有其他事務也想插入name為"Tom"的記錄,那么該事務就要等待到上一個事務的提交之后才能插入。
START TRANSACTION; SELECT * FROM test WHERE name = "Tom" FOR UPDATE; UPDATE test SET age = 22 WHERE name = "Tom"; COMMIT;
在事務中執行上述SELECT語句,MySQL也會為"Tom"的間隙添加鎖,以防止其他事務的插入操作。在加鎖的同時,該鎖也可以防止其他事務的刪除和更新操作。在UPDATE語句中,由于加鎖也會鎖定索引,所以可以在UPDATE語句中直接使用"Tom"作為WHERE條件。
唯一索引間隙鎖不僅僅適用于INSERT和UPDATE操作,也適用于DELETE操作。如果有事務對記錄加鎖,那么其他事務要想刪除該記錄也是無法進行的。
需要注意的是,如果加鎖的唯一索引已經被刪除,那么該鎖也會隨之釋放。同時,如果其他事務在該間隙中插入了一條值相同的記錄,那么在唯一索引的限制下,該事務是無法提交成功的。