MySQL集群锁定所有行

时间:2018-10-10 00:36:37

标签: mysql transactions mysql-cluster

我正在执行此测试以了解Mysql NDB群集如何工作。所以我有两个sql节点。 准备工作我创建了下表:

CREATE TABLE tb_id (
     id  bigint(20) NOT NULL AUTO_INCREMENT,
     ix bigint(20) default 0,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
)  ENGINE=ndbcluster DEFAULT CHARSET=latin1;

INSERT INTO tb_id (name, ix) VALUES
    ('dog', 1),('cat', 2),('penguin', 3), ('cow', 4),('tiger', 5),('fish', 6);

我创建2个会话,每个会话都在不同的节点上,并且我在两个节点上都运行:set session autocommit=off;之后,在第一个会话上我运行:

UPDATE tb_id SET ix = 2 where name="cat";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

不提交,并在会话2上运行以下命令:

UPDATE tb_id SET ix = 2 where name="fish";
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

为什么第二次会话失败,因为我没有更新同一行?

1 个答案:

答案 0 :(得分:1)

第二笔交易正在使用全表扫描来查找行 由于名称列上没有索引,因此无法更新。由于这是 更新,扫描将对所有行进行排他锁 决定是否应更新该行。 “ cat”行被锁定 独占,因此当全表扫描到达此行时,它将 等待该行被解锁。

如果您在名称列上有索引,该问题将消失。 但是更新或删除使用的条件是 没有索引支持,则必须获得独占锁定 表格中的每一行。