我在尝试使用INSERT..ON重复密钥更新更新多个行(一个批处理)时遇到了死锁。MySQL是将所有行锁定在一个批处理中,还是只在某个时间点锁定正在更新的行?
发布于 2013-10-28 13:35:19
这将取决于存储引擎。
MyISAM:执行表级锁。因此,所有行都被锁定。InnoDB:使用行级锁.由于InnoDB是事务性的,所以所有行都会被强制锁定。在运行SHOW ENGINE INNODB STATUS\G时,这些锁将是可见的。如果希望预先手动锁定这些行以防止共享,则可以运行选择。更新。发布于 2018-11-30 02:56:09
从mysql 5.7开始,如果值(有唯一索引)不存在,它将获得间隙锁。
插入..。选择。在重复键更新和加载数据时,并发替换的锁太弱,导致并发SELECT语句返回不一致结果的可能性。(Bug #38046,Bug #11749055)
有关详细信息,请参阅此链接:
https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-0.html
https://dba.stackexchange.com/questions/52323
复制相似问题