【发布时间】:2020-05-28 15:31:19
【问题描述】:
假设我有桌子:
CREATE TABLE t (id INTEGER AUTOINCREMENT NOT NULL, desc TEXT NOT NULL)
我用 1 个元素填充表格:
INSERT INTO TABLE t VALUES (1, 'Hello')
我在 MySQL 中运行了两个事务。在t1 我跑:
START TRANSACTION;
SELECT * FROM t WHERE id = 1 FOR UPDATE;
在t2 我跑:
START TRANSACTION;
SELECT * FROM t WHERE id = 1 FOR UPDATE;
此时我希望t1 在行上持有一个 e(X) 独占锁,而t2 等到它可以得到一个 X 锁(并且t2 确实被阻塞了,到目前为止一切都很好)。然后我在t1 中运行更新(没有任何 WHERE 子句!):
UPDATE t SET desc = 'Hello from t1';
此时在t2 我立即得到(无需COMMIT 事务)错误:
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
为什么会出现此错误?我猜t2 正在获得一个锁,需要继续进行完整的 UPDATE,从而造成死锁,但我不明白t2 如何获得锁,因为它应该等待t1 完成.
【问题讨论】:
-
我无法使用 5.5.27(在 Windows 上运行)重现此问题 - 对我来说这听起来像是一个错误。
-
你用的是什么版本?
-
MySQL 版本 5.5.35
标签: mysql