MySQL 四种插入命令及其特点与锁机制

目录

[1. INSERT INTO](#1. INSERT INTO)

[2. INSERT IGNORE INTO](#2. INSERT IGNORE INTO)

[3. INSERT INTO ... ON DUPLICATE KEY UPDATE](#3. INSERT INTO ... ON DUPLICATE KEY UPDATE)

[4. REPLACE INTO](#4. REPLACE INTO)

总结


MySQL提供了多种数据插入方式,每种方式在处理唯一键冲突时的行为不同,同时也涉及不同的锁机制。

1. INSERT INTO

INSERT INTO是标准的数据插入命令,用于在表中插入新行。

特点: 无就插入、有就报错

  • 插入新行。
  • 如果新行违反唯一键约束,则会产生错误并中止插入。

:

  • 通常获取行锁,锁定被插入的行。
  • 如果使用了事务隔离级别(可重读),可能还会涉及间隙锁,以防止幻读。
  • 正常情况下,如果按照唯一键顺序插入,死锁风险较低。

2. INSERT IGNORE INTO

INSERT IGNORE INTO在插入时忽视唯一键约束冲突。

特点: 无就插入,有就忽略当前行

  • 插入新行,但如果违反唯一键约束则忽略错误。
  • 不会因为唯一键冲突而中止操作。

:

  • 类似INSERT INTO,获取行锁。
  • 由于忽略冲突,可能减少锁竞争,降低死锁风险。

3. INSERT INTO ... ON DUPLICATE KEY UPDATE

在唯一键冲突时,更新现有的冲突行。

特点: 无就插入,有就更新

  • 如果没有唯一键冲突则插入,否则更新冲突行。
  • 避免了插入错误,提供了一种"尝试插入否则更新"的机制。

:

  • 获取行锁来插入或更新数据。
  • 如果涉及更新,可能会获取间隙锁,尤其在高并发环境下。
  • 更新操作增加了死锁的潜在风险。

4. REPLACE INTO

如果存在唯一键冲突,则删除旧行后插入新行。

特点: 无就插入,有就先删后插,

  • 插入前,先检查唯一键冲突,有则删除冲突行。
  • 实质上是一个删除再插入的操作。

:

  • 获取行锁以删除和插入数据。
  • 可能会获取间隙锁,尤其是在删除旧行时。
  • 由于涉及删除操作,可能会触发更复杂的锁机制,增加死锁风险。

总结

不同的插入命令在处理唯一键冲突时具有不同的行为。在锁的层面,INSERT INTOINSERT IGNORE INTO通常涉及行锁,而INSERT INTO ... ON DUPLICATE KEY UPDATEREPLACE INTO可能会涉及间隙锁,特别是在并发环境下。间隙锁是为了保持事务隔离性而设置的,它锁定了一个范围,防止其他事务插入到这个范围内。每种方式在并发场景下都有可能产生死锁,尤其是在多个事务试图以不同顺序访问同一组数据时。因此,设计数据库操作时需要考虑锁的影响,合理安排事务顺序,以减少死锁的可能性。

相关推荐
小钻风336621 分钟前
IDEA连接redis数据库时出现Failed to connect to any host resolved for DNS name.
数据库
ulias21227 分钟前
单元最短路问题
数据库·c++·算法·动态规划
安卓开发者29 分钟前
鸿蒙NEXT中SQLite数据库全面实战指南
数据库·sqlite·harmonyos
xuejianxinokok1 小时前
PostgreSQL 18 新功能:虚拟生成列
数据库·后端
知其然亦知其所以然1 小时前
MySQL8.x 面试高频题:为什么一定要有主键?99%的人答不全
后端·mysql·面试
DemonAvenger2 小时前
MySQL索引失效全解析:从分析到优化,10年经验实战分享
数据库·mysql·性能优化
咖啡Beans2 小时前
踩坑无数!MySQL UNION和ORDER BY混用的血泪教训,看完不再翻车
数据库·mysql
椰椰椰耶2 小时前
[Spring Cloud][3]从零开始简单工程搭建实践详解,远程调用
java·数据库·spring cloud
时序数据说2 小时前
物联网时序数据库IoTDB是什么?
大数据·数据库·物联网·时序数据库·iotdb
范纹杉想快点毕业2 小时前
请创建一个视觉精美、交互流畅的进阶版贪吃蛇游戏
数据库·嵌入式硬件·算法·mongodb·游戏·fpga开发·交互