InnoDB是否会锁定整个表以进行使用部分组合键的删除



我有一个MySQL表(称之为"my_table"(,它有一个由4列组成的主键(称为"a"、"b"、"c"one_answers"d"(。

至少有一次,我在调用'DELETE FROM my_table的并行异步EJB调用中遇到死锁,其中a=?并且b='具有不同的值,所以我开始研究InnoDB表锁定是如何工作的。

我没有发现关于表锁定如何使用组合键的明确文档。尽管被删除的实际行之间没有重叠,但整个表是否被删除所锁定?

我是否需要进行选择以恢复c和d的值并使用整个主键删除批?

这是在一个使用4个不同数据库的复杂应用程序的上下文中进行的。似乎只有MySQL有这个问题。

InnoDB从不为DML语句锁定整个表。(除非DML正在命中所有行。(

DDL语句还有其他锁,例如ALTER TABLE修改/添加列/索引等。(其中一些在MySQL 8.0中已经大大加快了速度。(

复合钥匙wrt锁定没有什么特别之处。

有一种东西叫做"间隙锁"。由于各种原因,索引中两个值之间的"间隙"将被锁定。这可以防止潜在的冲突,例如插入尚未存在的相同值,并且存在唯一性约束。

由于PRIMARY KEY是一个唯一的密钥,您可能已经命中了类似的内容。

如果可行,请执行SHOW ENGINE INNODB STATUS;检查锁是否为"间隙"。

另一种可能发生的情况是,锁可能一开始很弱,然后升级为"eXclusive"。这可能会导致僵局。

是否需要进行选择以恢复c和d的值并使用整个主键删除批?

我认为你需要更准确地解释你在做什么。提供查询。提供SHOW CREATE TABLE

InnoDB的锁处理可能是MySQL独有的。它有一些怪癖。有时它对自己锁定的东西有点贪婪;作为补偿,它可能比竞争对手更快。

在任何情况下,都要检查死锁(和超时(并进行处理。希望这些问题足够罕见,必须处理它们不会给性能带来太大负担。

DELETE FROM my_table where a=? and b=?意味着潜在的大量行正在被删除。这意味着undo日志和MVCC需要做大量的工作。因此,我建议尽量不要一次删除(或更新(超过1K行。

最新更新