gpt4 book ai didi

mysql - 对于使用部分组合键的删除,InnoDB 是否会锁定整个表?

转载 作者:行者123 更新时间:2023-11-29 10:00:45 25 4
gpt4 key购买 nike

我有一个 MySQL 表(称为“my_table”),其主键由 4 列组成(称为“a”、“b”、“c”和“d”)。

至少有一次,我在并行异步 EJB 调用“DELETE FROM my_table where a=?”时遇到了死锁。和 b=?' 具有不同的值,所以我开始研究 InnoDB 表锁定的工作原理。

我没有找到关于表锁定如何与组合键一起工作的明确文档。尽管实际删除的行之间没有重叠,但整个表是否都被删除锁定?

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

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

最佳答案

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

DDL 语句还有其他锁,例如当 ALTER TABLE 正在修改/添加列/索引/等时。 (其中一些在 MySQL 8.0 中得到了极大的加速。)

复合 key 与锁定没有​​什么特别之处。

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

由于PRIMARY KEY是一个唯一的键,因此您可能已经按下了类似的键。

如果可行,请执行SHOW ENGINE INNODB STATUS;来查看锁是否为“间隙”。

可能发生的另一件事是锁可能一开始很弱,然后升级为“独占”。这可能会导致死锁。

Do I need to do a select to recover the values for c and d and delete batches using the whole primary key?

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

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

无论如何,检查死锁(和超时)并处理它们。希望这些问题足够罕见,以便处理它们不会造成太大的性能负担。

从 my_table 中删除,其中 a=? b=? 表示可能会删除大量行。这意味着undo log和MVCC需要做很多工作。因此,我建议尝试不要一次删除(或更新)超过 1K 行。

关于mysql - 对于使用部分组合键的删除,InnoDB 是否会锁定整个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53012549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com