我正在阅读一本关于InnoDB事务的手册,但仍然有很多不清楚的地方。例如,我不太理解以下行为:
-- client 1 -- client 2
mysql> create table simple (col int)
engine=innodb;
mysql> insert into simple values(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into simple values(2);
Query OK, 1 row affected (0.00 sec)
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> update simple set col=10 where col=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> update simple set col=42 where col=2;
-- blocks
现在,最后一条更新命令(在客户端2中)正在等待。我原以为只有行1被锁定,所以期望命令能够执行。即使客户端2中的第二个命令是插入,行为也是相同的。能否有人描述一下这个例子背后的锁定背景(锁定发生在哪里以及为什么会发生锁定)?
REPEATABLE READ
:对于锁定读取(使用FOR UPDATE或LOCK IN SHARE MODE的SELECT)、UPDATE和DELETE语句,锁定取决于语句是否使用具有唯一搜索条件的唯一索引**或范围类型搜索条件。... - ypercubeᵀᴹ