0

innodb READ-COMMITTED:

桌子:

CREATE TABLE `test` ( `key1` int(11) NOT NULL, `key2` int(11) DEFAULT NULL, PRIMARY KEY (`key1`) ) ENGINE=innodb DEFAULT CHARSET=utf8;

CREATE TABLE `test1` ( `key1` int(11) NOT NULL, `key2` int(11) DEFAULT NULL, PRIMARY KEY (`key1`) ) ENGINE=innodb DEFAULT CHARSET=utf8;

insert into test values(1,1);
insert into test1 values(1,1);

情况1:

connection 1:
begin;
update test set key2=111 where key1 in (select key1 from test1);
// test1 lock with LOCK_NONE (no lock); (sql_command:SQLCOM_UPDATE )

then 
connection 2:
update test1 set key2=9994;
Query OK, 1 row affected (0.091 sec)
Rows matched: 1  Changed: 1  Warnings: 0

案例2:

connection 1:
begin;
update test a inner join (select key1 from test1) b on a.key1=b.key1 set a.key2=111;
// test1 lock with LOCK_S (sql_command:SQLCOM_UPDATE_MULTI )

then 
connection 2:
update test1 set key2=9994;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

在 ha_innobase::store_lock 中,只处理了 SQLCOM_UPDATE。

为什么 SQLCOM_UPDATE_MULTI 不能是 LOCK_NONE ?,但是 SQLCOM_UPDATE 和 LOCK_NONE 。

4

0 回答 0