我有一个mysql表(称之为‘myu表’),它有一个由4列组成的主键(称为‘a’、‘b’、‘c’和‘d’)。
我至少有一次在调用“delete from my\ u table where a=”的并行异步ejb调用上遇到死锁?和b=?'的值不同,所以我开始研究innodb表锁是如何工作的。
我还没有找到关于表锁定如何与组合键一起工作的明确文档。整个表是否被delete锁定,尽管实际删除的行之间没有重叠?
我是否需要执行select来恢复c和d的值并使用整个主键删除批处理?
这是在一个使用4个不同数据库的复杂应用程序的上下文中进行的。似乎只有mysql有这个问题。
1条答案
按热度按时间ycl3bljg1#
innodb从不为dml语句锁定整个表(除非dml正在命中所有行。)
ddl语句还有其他锁,例如
ALTER TABLE
正在修改/添加列/索引等(其中一些在mysql 8.0中已经大大加快了速度)有没有什么特别的复合钥匙wrt锁。
有一种东西叫做“间隙锁”。由于各种原因,索引中两个值之间的“差距”将被锁定。这可以防止潜在的冲突,例如插入不存在的新值,并且存在唯一性约束。
自从
PRIMARY KEY
是一个独特的关键,你可能击中了这样的东西。如果可行,请
SHOW ENGINE INNODB STATUS;
看看锁是不是“缝隙”。另一个可能发生的情况是,锁可以从弱开始,然后升级到“独占”。这可能导致死锁。
我是否需要执行select来恢复c和d的值并使用整个主键删除批处理?
我认为你需要更准确地解释你在做什么。提供查询。提供
SHOW CREATE TABLE
.innodb的锁处理可能是mysql独有的。它有一些怪癖。有时它对锁的东西有点贪心;作为补偿,它可能比竞争对手更快。
在任何情况下,检查死锁(和超时)并处理它们。希望这些问题非常罕见,因此必须处理它们不会对性能造成太大负担。
DELETE FROM my_table where a=? and b=?
意味着可能会删除大量行。这意味着undo log和mvcc需要做很多工作。因此,我建议不要一次删除(或更新)超过1k行。