?
目录
3. INSERT INTO ... ON DUPLICATE KEY UPDATE
? MySQL提供了多种数据插入方式,每种方式在处理唯一键冲突时的行为不同,同时也涉及不同的锁机制。
? INSERT INTO
是标准的数据插入命令,用于在表中插入新行。
特点: 无就插入、有就报错
锁:
?INSERT IGNORE INTO
在插入时忽视唯一键约束冲突。
特点: 无就插入,有就忽略当前行
锁:
INSERT INTO
,获取行锁。?在唯一键冲突时,更新现有的冲突行。
特点: 无就插入,有就更新
锁:
? 如果存在唯一键冲突,则删除旧行后插入新行。
特点: 无就插入,有就先删后插,
锁:
? ?不同的插入命令在处理唯一键冲突时具有不同的行为。在锁的层面,INSERT INTO
和INSERT IGNORE INTO
通常涉及行锁,而INSERT INTO ... ON DUPLICATE KEY UPDATE
和REPLACE INTO
可能会涉及间隙锁,特别是在并发环境下。间隙锁是为了保持事务隔离性而设置的,它锁定了一个范围,防止其他事务插入到这个范围内。每种方式在并发场景下都有可能产生死锁,尤其是在多个事务试图以不同顺序访问同一组数据时。因此,设计数据库操作时需要考虑锁的影响,合理安排事务顺序,以减少死锁的可能性。