MySQL重复键错误导致重复索引记录上的共享锁定设置?

时间:2014-01-14 10:49:56

标签: mysql database

我已阅读MySQL 14.2.7.6的文档。由InnoDB中的不同SQL语句设置的锁

http://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html

我的问题:

  1. 我不明白为什么文档说明:

      

    如果发生重复键错误,则在重复索引上使用共享锁   记录已设定。这种共享锁的使用可能导致死锁   有多个会话试图插入相同的行,如果另一个   会话已经有一个独占锁。如果是另一个,可能会发生   session删除该行。

    为什么它会在INSERT操作之后设置对行的锁定 失败。它获得了什么锁?

  2. “SELECT ... LOCK IN SHARE MODE”正在执行时是否设置了意图共享(IS)锁?是一个意图独占(IX)锁定集 当“UPDATE,INSERT,DELETE”或“SELECT ... FOR UPDATE”是 执行

1 个答案:

答案 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 锁定。
  •