cli*_*ime 8 mysql innodb transactions isolation-level database-locking
我正在阅读一本关于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
Run Code Online (Sandbox Code Playgroud)
现在,最后一个更新命令(在客户端2中)等待.我希望命令执行,因为我认为只有第1行被锁定.即使客户端2中的第二个命令是,行为也是相同的insert.任何人都可以描述这个例子背后的锁定背景(锁的位置和原因)?
InnoDB设置特定类型的锁,如下所示.
SELECT ... FROM是一致的读取,读取数据库的快照并设置无锁,除非事务隔离级别设置为SERIALIZABLE.对于SERIALIZABLE级别,搜索会在遇到的索引记录上设置共享的下一键锁定.
SELECT ... FROM ... LOCK IN SHARE MODE在搜索遇到的所有索引记录上设置共享的下一键锁定.
对于搜索遇到的索引记录,SELECT ... FROM ... FOR UPDATE阻止其他会话执行SELECT ... FROM ... LOCK IN SHARE MODE或读取某些事务隔离级别.一致读取将忽略在读取视图中存在的记录上设置的任何锁定.
UPDATE ... WHERE ...在搜索遇到的每条记录上设置一个独占的下一键锁定.
DELETE FROM ... WHERE ...在搜索遇到的每条记录上设置一个独占的下一键锁定.
INSERT在插入的行上设置独占锁.此锁是索引记录锁,而不是下一键锁(即没有间隙锁),并且不会阻止其他会话在插入行之前插入间隙.
InnoDB有几种类型的记录级锁:
记录锁定:这是对索引记录的锁定.
间隙锁定:这是锁定索引记录之间的间隙,或锁定在第一个或最后一个索引记录之前的间隙.
下一键锁定:这是索引记录上的记录锁定和索引记录之前的间隙上的间隙锁定的组合.
看更多 :