Mysql INSERT..中的锁定如何在重复的密钥更新语句中工作?

Mysql INSERT..中的锁定如何在重复的密钥更新语句中工作?,mysql,insert-update,database-deadlocks,Mysql,Insert Update,Database Deadlocks,尝试在重复密钥更新时使用INSERT..更新多行(一批)时遇到死锁。 MySQL是锁定一批中的所有行,还是只锁定在某个时间点更新的行?根据: 在MySQL 5.6.6之前,插入。。。在使用存储引擎(如MyISAM)对分区表进行重复密钥更新时,MyISAM使用表级锁锁定表的所有分区(对于使用存储引擎的表,例如使用行级锁定的InnoDB,这种情况没有也不会发生。)在MySQL 5.6.6及更高版本中,这种语句只锁定更新了分区键列的分区。有关更多信息,请参见第18.6.4节“分区和锁定” 我猜Inno

尝试在重复密钥更新时使用INSERT..更新多行(一批)时遇到死锁。 MySQL是锁定一批中的所有行,还是只锁定在某个时间点更新的行?

根据:

在MySQL 5.6.6之前,插入。。。在使用存储引擎(如MyISAM)对分区表进行重复密钥更新时,MyISAM使用表级锁锁定表的所有分区(对于使用存储引擎的表,例如使用行级锁定的InnoDB,这种情况没有也不会发生。)在MySQL 5.6.6及更高版本中,这种语句只锁定更新了分区键列的分区。有关更多信息,请参见第18.6.4节“分区和锁定”


我猜
InnoDB
将使用索引并避免表级锁定(除非表太小,MySQL将直接使用表级锁定)。

如果禁用自动提交,则MySQL将锁定所有接触的行,并在提交时释放已放置的锁,这可能是一个更好的问题。以一致的顺序插入记录(插入前按主键值对批记录进行排序),以避免死锁。