MySQL 插入数据死锁问题分析:非主键字段锁竞争
MySQL 在执行插入操作时,会对涉及到的数据行进行加锁,以确保数据的一致性和完整性。如果插入数据时,涉及到了已经被其他事务锁定的数据行,就会出现死锁的情况。
在以下 SQL 示例中,虽然 'recordType'、'syncId'、'syncCode' 字段都不是主键或唯一键,但如果表中已经存在相同的记录,执行 'ON DUPLICATE KEY UPDATE' 语句时,就会更新已有的记录,因此 MySQL 会对这些数据行进行加锁操作,以防止其他事务同时对同一行进行更新。多个事务同时对这些行进行操作,就会出现死锁的情况。
insert into sync_fail (recordType,syncId,syncCode) values ('demo',43,'ZC2020080606'),('demo',44,'ZC2020080607') ON DUPLICATE KEY update retries = 0,status = 100,errorMsg = null,allowRetry = 0;
为了解决这个问题,可以考虑对表或索引进行优化,减少锁竞争的概率。例如,可以增加主键或唯一键,或者使用更合理的索引。同时,也可以通过调整事务隔离级别等方式来减少锁竞争的影响。
原文地址: https://www.cveoy.top/t/topic/obC7 著作权归作者所有。请勿转载和采集!