MySQL 以原子方式执行单个语句吗?
does MySQL executes single statement atomically?
说,我有 2 个连接,它们正在执行以下代码。
会导致死锁吗?
connection 1-> lock tables A write, B write;
connection 2-> lock tables B write, A write;
您可以通过在两个连接中使用 LOCK TABLES A WRITE, B WRITE;
来消除死锁的风险。这是原子的,所以第二个连接会等待。
如果不使用 LOCK TABLES
,有死锁的风险。
在某些情况下,即使是单个 SQL 语句也可能会死锁。我们在我目前的工作场所经常看到这种情况,例如,如果 table 有多个主键或唯一键。例如:
CREATE TABLE MyTable (
id INT AUTO_INCREMENT PRIMARY KEY,
x INT,
UNIQUE KEY (x)
);
MySQL 似乎有一个允许死锁的设计缺陷,因为它 不是 原子语句获取多个唯一键上的锁。
说,我有 2 个连接,它们正在执行以下代码。 会导致死锁吗?
connection 1-> lock tables A write, B write;
connection 2-> lock tables B write, A write;
您可以通过在两个连接中使用 LOCK TABLES A WRITE, B WRITE;
来消除死锁的风险。这是原子的,所以第二个连接会等待。
如果不使用 LOCK TABLES
,有死锁的风险。
在某些情况下,即使是单个 SQL 语句也可能会死锁。我们在我目前的工作场所经常看到这种情况,例如,如果 table 有多个主键或唯一键。例如:
CREATE TABLE MyTable (
id INT AUTO_INCREMENT PRIMARY KEY,
x INT,
UNIQUE KEY (x)
);
MySQL 似乎有一个允许死锁的设计缺陷,因为它 不是 原子语句获取多个唯一键上的锁。