mysqlinsertinto...select语句为什么会造成死锁?

若session 1回滚,释放排它锁,session 2和session 3则可获得共享锁,此时两session死锁,均持有共享锁,欲获得排它锁。实际测试证实此现象。但疑惑的是,若session 1 commit,为何不会导致死锁,这原因尚不明了,期待高手解答。MySQL锁机制复杂,看似简单的SQL操作有时会引发死锁,初次遇到时会感到困惑...
mysqlinsertinto...select语句为什么会造成死锁?
在实际开发中,我遇到过MySQL死锁问题,深入研究了MySQL的锁机制以及产生死锁的场景。

具体分析,如发现不正确之处,请指正!

确实,数据表中若无记录,同时并发插入两条统一条记录(包含唯一键相同)可能导致死锁。

设想三个session并发插入同一条记录(假设t1为唯一键):

插入操作会加排它锁。假设session 1获取排它锁,session 2和session 3则会报主键重复错误,此时行加共享锁。若有多个session尝试插入同一行,且另一session已持有排它锁,session 2和session 3均会尝试获得共享锁。若session 1回滚,释放排它锁,session 2和session 3则可获得共享锁,此时两session死锁,均持有共享锁,欲获得排它锁。

实际测试证实此现象。但疑惑的是,若session 1 commit,为何不会导致死锁,这原因尚不明了,期待高手解答。

MySQL锁机制复杂,看似简单的SQL操作有时会引发死锁,初次遇到时会感到困惑。

我曾总结过MySQL锁机制及常见死锁场景,分享了一个ppt,详情参见:技术分享-MySQL InnoDB locks and deadlocks。

以下提供一些有价值的参考资料:

(1)MySQL官方文档,详细介绍了InnoDB锁机制: MySQL :: MySQL 5.5 Reference Manual :: 14.8.3 Locks Set by Different SQL Statements in InnoDB。

(2)阿里巴巴DBA专家何登成的博客,提供了深入解析:何登成的技术博客。

(3)《高性能MySQL》一书,对MySQL锁机制有详细讲解。2024-08-26
mengvlog 阅读 8 次 更新于 2025-07-21 03:02:42 我来答关注问题0
  •  文暄生活科普 MySQL的insert into XX value语句和 insert into XX values 语句 的区别

    在MySQL中,通过`insert into 表名(字段名,字段名) value(字段名的值, 字段名的值')`和`insert into 表名(字段名,字段名) values(字段名的值, 字段名的值)`这两个语句可以插入数据。两者的区别在于执行时间,具体表现为以下两点。首先,对于单条数据的插入,使用`value`语句比`values`语...

  •  文暄生活科普 MySQL中的INSERT INTO SELECT语法及其用法详解

    INSERT INTO SELECT语句的核心原理是,通过查询操作获取所需的数据,然后将这些数据直接插入到另一张表中。这种功能在需要数据迁移、复制表内容或者根据查询结果创建新表时显得尤为便捷。它的基本语法格式如下:INSERT INTO 表名 SELECT FROM 源表名 WHERE 条件 (可选)例如,在工单平台版本管理中,假设我们...

  •  文暄生活科普 MySQL的insert into select 引发锁表

    1. INSERT INTO SELECT的注意事项执行此操作时,MySQL会对每行数据逐行加锁,直到复制所有符合条件的数据。这可能导致在业务繁忙时锁住整个表,影响写入操作。因此,除非必要,应尽量避免在事务活跃期间使用。2. CREATE TABLE AS SELECT作为优化创建新表作为选择的结果,可以针对性地选择复制字段,减少复制时...

  •  刺任芹O mysql insert into语句中, values()是什么作用?

    sql语句中,添加记录的语法为:insert into 表名 (col1,col2...coln)values(value1,value2...valuen);其中,如果你插入的每一列都是顺序插入,无一缺漏的话,(col1,col2...coln)可以省略。也就是上式也可以简化为:insert into 表名 values(value1,value2...valuen);看了你写的sql...

  •  张三讲法 MySQL中insert into语句的6种写法

    insert into是mysql中最常用的插入语句,它有6种写法。如果插入的记录是数字的话要在数字的逗号后面加n:通过以上实例我们可以看到insert into语句只能向原表中插入于其字段对应的数据,那么能不能通过insert into语句来把其他表的数据插入到原表中呢:在MySQL中set方法:ModifyStatement.Set Method 修改...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部