前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >​insert on duplicate key死锁问题分析

​insert on duplicate key死锁问题分析

作者头像
AsiaYe
发布2020-01-13 11:16:38
1.9K0
发布2020-01-13 11:16:38
举报
文章被收录于专栏:DBA随笔DBA随笔

//

insert on duplicate key死锁问题分析

//

开始今天的文章之前,先说明下昨天文章中的一个错误,昨天文章最后说replace into带来的死锁问题可以使用insert into duplicate key update的方法来解决,今天实际测试的时候,还是遇到了一些问题,改方法并没有完全解决死锁的问题,来看测试的结果。

首先,我们新建一个test表,其中包含3列,a,b,c,其中a是主键,b是唯一索引,c是普通列,往test表中插入一条记录,该记录如下:(2020,5,5),然后在3个会话中执行下面的语句:

死锁信息对应的命令行输出如下:

代码语言:javascript
复制
mysql:yeyztest 22:14:18>>begin;
Query OK, 0 rows affected (0.00 sec)
mysql:yeyztest 22:14:20>>replace into test_replace values (2024,5,5);
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
mysql:yeyztest 22:14:31>>replace into test_replace values (2024,5,5);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

这是在使用replace的方法进行插入的时候遇到的问题。当我们将3个session中的replace的方法全部换成insert into ... on duplicate key的时候,该问题没有得到解决,还是报一样的错误,如下:

代码语言:javascript
复制
mysql :yeyztest 22:15:44>>begin;
Query OK, 0 rows affected (0.00 sec)

mysql :yeyztest 22:20:16>>insert into test_replace values (2025,5,5) on duplicate key update id=2024;
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

查询了MySQL在insert的时候的加锁情况,官网上的介绍如下:

https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html

详读官方文档上的这个文章,相信可以解决你的疑问。

该网址上面的例子,几乎完整的复现了上述死锁的情况,就是说,加入有两条并发的insert操作要对同一条记录加共享锁,而此时这条记录又被其他事务加上了排它锁,当排它锁的事务回滚或者提交之后,两个并发的insert操作是会发生死锁的,原因是由于这两条并发的insert操作,都对这条记录加上了共享锁,所以都无法获取该条记录的排它锁,除非一条insert语句回滚。

最后给出一张锁的兼容性的表供大家参考:

有帮助的话还希望点下再看哈

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档