【发布时间】:2021-12-14 22:44:05
【问题描述】:
说,我有 2 个连接,它们正在执行以下代码。 会不会导致死锁?
connection 1-> lock tables A write, B write;
connection 2-> lock tables B write, A write;
【问题讨论】:
标签: mysql sql database-deadlocks
说,我有 2 个连接,它们正在执行以下代码。 会不会导致死锁?
connection 1-> lock tables A write, B write;
connection 2-> lock tables B write, A write;
【问题讨论】:
标签: mysql sql database-deadlocks
您可以通过在两个连接中使用LOCK TABLES A WRITE, B WRITE; 来消除死锁的风险。这是原子的,所以第二个连接会等待。
如果不使用LOCK TABLES,则存在死锁风险。
在某些情况下,即使是单个 SQL 语句也可能死锁。我们在我目前的工作场所经常看到这种情况,例如,如果一个表有多个主键或唯一键。例如:
CREATE TABLE MyTable (
id INT AUTO_INCREMENT PRIMARY KEY,
x INT,
UNIQUE KEY (x)
);
MySQL 似乎有一个允许死锁的设计缺陷,因为它不是一个语句获取多个唯一键上的锁的原子。
【讨论】:
WRITE 或READ。阅读dev.mysql.com/doc/refman/8.0/en/lock-tables.html 了解语法的详细信息。