我已阅读MySQL 14.2.7.6的文档。由InnoDB中的不同SQL语句设置的锁
http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
我的问题:
我不明白为什么文档说明:
如果发生重复键错误,则在重复索引上使用共享锁 记录已设定。这种共享锁的使用可能导致死锁 有多个会话试图插入相同的行,如果另一个 会话已经有一个独占锁。如果是另一个,可能会发生 session删除该行。
为什么它会在INSERT操作之后设置对行的锁定 失败。它获得了什么锁?
“SELECT ... LOCK IN SHARE MODE”正在执行时是否设置了意图共享(IS)锁?是一个意图独占(IX)锁定集 当“UPDATE,INSERT,DELETE”或“SELECT ... FOR UPDATE”是 执行
答案 0 :(得分:2)
0.1。它需要锁定现有条目,以便后续尝试插入重复记录时始终失败:
-- Transaction A
BEGIN TRANSACTION;
INSERT INTO mytable VALUE(1); -- fails as "duplicate"
-- Transaction B
BEGIN;
DELETE FROM mytable WHERE field = 1; -- must be put on hold, see below
-- Transaction A
-- transaction is still in progress
INSERT INTO mytable VALUE(1); -- must fail to stay consistent with the previous attempt
0.2。 Yes, and yes:
意图锁定协议如下:
- 在交易可以获取表 t 中某行的 S 锁定之前,它必须首先获得 IS 或更强的锁定<强>吨即可。
- 在交易获得行上的 X 锁定之前,它必须首先在 t 上获得 IX 锁定。