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 阅读 81 次 更新于 2025-09-09 20:06:07 我来答关注问题0
  •  文暄生活科普 MySQL的insert into XX value语句和 insert into XX values 语句 的区别

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

  • 第一种,通过insert into SQL语句逐行插入。基本语法:INSERT INTO table_name ( field1,field2,...fieldN ) VALUES ( value1,value2,...valueN );语法解析:insert into 表名 (字段名1,字段名2,字段名3,...字段名n) values (值1,值2,值3,...值n)注意:字段名与值是一一对应的...

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

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

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

    ModifyStatement.Set Method 修改语句 set方法 Sets key and value. 设置键和值。由于insert into语句是一个插入性的语句,所以它的功能要么向指定的表插入数据 也许你看到这个SQL语句是正确的,就觉得这样应该也可以:mysql> mysql> insert into 4a set sname=4ainall.sname;ERROR 1064 (4200...

  •  刺任芹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相关话题

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