我正在执行此测试以了解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
为什么第二次会话失败,因为我没有更新同一行?
答案 0 :(得分:1)
第二笔交易正在使用全表扫描来查找行 由于名称列上没有索引,因此无法更新。由于这是 更新,扫描将对所有行进行排他锁 决定是否应更新该行。 “ cat”行被锁定 独占,因此当全表扫描到达此行时,它将 等待该行被解锁。
如果您在名称列上有索引,该问题将消失。 但是更新或删除使用的条件是 没有索引支持,则必须获得独占锁定 表格中的每一行。