【发布时间】:2025-12-28 03:40:06
【问题描述】:
我们非常沮丧地遇到了 MySQL 中的死锁。这不是因为超过锁定超时,因为死锁在发生时会立即发生。下面是在 2 个独立线程(与连接池中的 2 个独立连接)上执行的 SQL 代码,它会产生死锁:
UPDATE Sequences SET Counter = LAST_INSERT_ID(Counter + 1) WHERE Sequence IS NULL
Sequences 表有 2 列:Sequence 和 Counter
LAST_INSERT_ID 允许我们retrieve this updated counter value as per MySQL's recommendation。这对我们来说是完美的,但是我们遇到了这些僵局!我们为什么会得到它们,我们如何避免它们??
非常感谢您对此的任何帮助。
编辑:这一切都在事务中(因为我使用的是 Hibernate,所以需要)并且 AUTO_INCREMENT 在这里没有意义。我应该更清楚。 Sequences 表包含许多序列(在我们的例子中大约有 1 亿个)。我需要增加一个计数器并检索该值。 AUTO_INCREMENT 在所有这些中都不起作用,这与 Id 或 PRIMARY KEY 无关。
【问题讨论】:
-
能否请您发布
SHOW CREATE TABLE Sequences的输出? -
CREATE TABLE
sequences(Idbigint(20) NOT NULL AUTO_INCREMENT,Sequencevarbinary(1005) DEFAULT NULL,Counterint(11) DEFAULT '0', PRIMARY KEY (Id), 唯一键Sequences_Constraint(Sequence(104)) ) ENGINE=InnoDB AUTO_INCREMENT=134 DEFAULT CHARSET=utf8
标签: sql mysql database deadlock database-deadlocks