InnoDB 怎么可能在单行上死锁?

Posted

技术标签:

【中文标题】InnoDB 怎么可能在单行上死锁?【英文标题】:How is it possible for InnoDB to deadlock on a single row? 【发布时间】:2016-03-13 21:51:58 【问题描述】:

根据The Good Word,

InnoDB 使用自动行级锁定。即使在仅插入或删除单行的事务的情况下,您也可能会出现死锁。那是因为这些操作并不是真正的“原子”;它们会自动对插入或删除的行的(可能多条)索引记录设置锁。

两个进程怎么可能在一条记录上死锁?

【问题讨论】:

我想知道一个锁定行,另一个锁定索引行。 是的,我也在想同样的事情……有没有可能它必须获得很多锁?每个索引一个?而不是连续的? 我找到了答案! dev.mysql.com/doc/refman/5.7/en/innodb-lock-modes.html如果有人想写,请随意:) 快速示例。如果超过 200 个 trx 正在等待一个锁,InnoDB 认为这是一个死锁。 dev.mysql.com/doc/refman/5.7/en/innodb-lock-modes.html 。不过,这并不是真正的僵局。 也许这是链接:doc.docs.sk/mysql-refman-5.5/innodb-lock-modes.html 【参考方案1】:

因为两个进程在事务中保存完全相同的行(例如银行帐户)并希望对其进行更改。

因此,在同一个银行账户的情况下,如果需要进行一次提款,则还不能进行另一次提款,因为您可能会遇到银行账户可能没有足够的钱进行第二次提款的情况。

这个想法与死锁有关,就是尽可能缩短锁定时间。

【讨论】:

以上是关于InnoDB 怎么可能在单行上死锁?的主要内容,如果未能解决你的问题,请参考以下文章

减少InnoDB死锁发生的方法有什么?MySQL学习

哇靠,死锁了之innodb锁解读

mysql之show engine innodb status解读(转)

死锁 BLOB INSERT MySQL 8.0 InnoDB 集群

mysql innodb 行锁解锁后出现死锁

InnoDB RR隔离级别下INSERT SELECT两种死锁案例剖析