一个innodb next-key lock的问题


表结构:


 CREATE TABLE `test_lock` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8

隔离级别:REPEATABLE-READ
innodb_locks_unsafe_for_binlog:0

表内容:


 +----+
| id |
+----+
| 12 |
| 39 |
| 59 |
+----+

session1:


 mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test_lock where id <= 39 for update;
+----+
| id |
+----+
| 12 |
| 39 |
+----+
2 rows in set (0.00 sec)

session2:


 mysql> insert into test_lock values(40);

问题:
1. id 是主键,为什么session2还会等待session1的锁呢
2.就算有next-key lock,它不应该是锁住(39, 59]吗,为什么在session2中插入的值是70时还会等待呢。

mysql innodb

卖萌so可耻 11 years, 6 months ago

首先N锁是加在索引记录上的,而<=39会对39和59两条记录加N锁。
insert操作会先发起一个I锁(插入意向锁),这个I锁是要对59加的,根据精确兼容性,对已持有N锁的记录加I锁会冲突。

不给力啊牲畜 answered 11 years, 6 months ago

Your Answer