记一次replace into引发的死锁问题
记一次replace into引发的死锁问题
需求是使用kafka监听历史表的变动,写入到新表之中。写数据的核心代码用到了mysql 的 replace into
public hanlde(DebeziumEventRecord record){...TradeMapper mapper = sqlSession.getMapper(TradeMapper.class);int result = mapper.replace(trade);...
}
测试环境运行正常。部署生产环境之后,就观察到了死锁日志
org.springframework.dao.DeadlockLoserDataAccessException:
Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
网上检索资料推测是replace into并发修改同一条数据记录引起的死锁。因为只是临时监听代码,就简单的在修改记录时加上了分布式锁。
public hanlde(DebeziumEventRecord record){...DistLock distLock = distLockFactory.build("TRADE_LOCK_KEY_" + trade.getTradeNo());distLock.tryAcquire();TradeMapper mapper = sqlSession.getMapper(TradeMapper.class);int result = mapper.replace(trade);distLock.release();...
}
部署之后,没过一会产线继续收到死锁的报错日志。已知分布式锁的实现没有问题,那么就代表死锁原因并不是并发修改同一条记录引起的。
怀疑是不是只要同时进行多个replace into操作就会引起死锁呢。写了一个简单的python脚本并多开进行实验(python是伪多线程)。
cursor.execute("replace into LockTest (id,value) values (1, 2);")
多个进程长时间运行未发生死锁。认为可能是表数据太少执行太快没有发生,对表填充数据后依然无死锁发生。可以初步推断只是并发进行同一张表的replace into并不会发生死锁。诱发死锁还需要一个限定条件。
查询相关资料,https://www.jianshu.com/p/497fd78f0b91。文中提到replace into即会对主键加Gap锁,又会对唯一索引加next key锁。那么死锁应该是并发执行时分别获取到部分锁引起的。
cursor.execute("replace into LockTest (id,value) values (1, 2);")
cursor.execute("replace into LockTest (id,value) values (2, 2);")
实验在不同客户端中并发修改不同的数据,此时终于复现了死锁,换成insert … on duplicate key则无此问题。
结论:replace into不适宜在产线环境大规模使用,如有需要考虑使用insert … on duplicate key
记一次replace into引发的死锁问题相关推荐
- 外键字段未建索引引发的死锁
现象:一个很简单的程序在压力测试过程中发现死锁,查看trace文件,发现如下信息: Deadlock graph: ---------Blocker(s)-------- ---------Waite ...
- 记一次升级Oracle驱动引发的死锁
问题描述 近期项目需要从虚拟机环境迁移到容器环境,其中有一个项目在迁移到容器环境之后的两天之内出现了2次"死锁(deadlock)"的问题,部分关键日志如下: Found one ...
- oracle大数据量更新引发的死锁问题解决方法及oracle分区和存储过程的思考
前言 前几天上午在对数据库的一张表进行操作的时候,由于这张表是按照时间的一张统计表,正好到那天没有测试数据了,于是我想将表中所有的时间,统一更新到后一个月,于是对80w条数据的更新开始了.整个过程曲折 ...
- mysql Insert on duplicate引发的死锁
表 CREATE TABLE `test_dup` ( `id` int(11) NOT NULL AUTO_INCREMENT, `num` int(10) unsigned DEFAULT NUL ...
- Java线上问题排障:Linux内核bug引发JVM死锁导致线程假死
Java本质上还是离不开操作系统,一来Java源码是用C/C++实现的,二来java进程还是需要依附于操作系统和硬件资源,有时候一些问题是操作系统级别导致的,下面的整个事件是源自一则真实的线上案例. ...
- bug诞生记——信号(signal)处理导致死锁
这个bug源于项目中一个诡异的现象:代码层面没有明显的锁的问题,但是执行时发生了死锁一样的表现.我把业务逻辑简化为:父进程一直维持一个子进程.(转载请指明出于breaksoftware的csdn博客) ...
- sql server一个查询语句引发的死锁
程序错误日志大量的报死锁错误,去数据库错误日志查看确实有很多死锁(应在数据库实例启动时执行dbcc traceon(1222,-1)开启死锁跟踪): 04/29/2016 14:07:51,spid3 ...
- winform 让他间隔一段时间 执行事件 且只执行一次_记一次golang定时器引发的诡异错误...
作为一只在9127工作制下摸鱼的程序猿,周六自然是愉快的加班了.一早上除了一位新同学在我们的"敏捷迭代"下错删了接口之外没什么大事. 临近中午,突然隔壁组大佬找到我,表示有个go语 ...
- Mysql并发插入引发的死锁
案发现场 项目中有一张业务关联表t_biz_ref,最近给该表建立了复合索引,测试阶段并发执行插入操作频繁出现死锁情况. t_biz_ref表结构 CREATE TABLE `t_biz_ref` ( ...
最新文章
- Windows自带certutil工具校验用法
- MySQL SHOW TABLE STATUS 获取表的信息
- 硬核NeruIPS 2018最佳论文,一个神经了的常微分方程
- 除了缓存,Redis 都解决了哪些问题?
- 在python中 函数赋值给变量时,需要注意的几个事项
- scala学习笔记-集合操作(15)
- 用户用户组及权限管理
- 04 16 团队竞技(第二场) 赛后总结
- 前端学习之HTML基本标签介绍
- strcore.cpp(156) 内存泄漏
- 什么? 搞不定 Redis 分布式锁?
- 【数据结构笔记】Leetcode买卖股票的最佳时机 系列总结
- 【图像融合】基于matlab GUI小波变换彩色图像融合(带面板)【含Matlab源码 782期】
- 能量谱 matlab,频谱、幅度谱、功率谱和能量谱含义
- 供应链管理 MOOC学习笔记(全)
- 团队管理(一)-会议纪要的高效记录和执行
- 金山词霸2007升级v10.0.0.4
- 黑苹果开机界面的启动项设置
- 主力吸筹的两种模式以及躺赢股市的三种票
- 如何把阿拉伯数字转换为中文大写?
热门文章
- VMware Workstation15配置虚拟网络编辑器固定IP地址
- 办工长时间使用计算机复印机,项目经理部管理制度汇编
- R入门(一)----读取数据、查看数据
- git 与github配置(老师详细版)
- 有钱人抢豪宅,普通人不敢消费:社会在割裂,富人更富,穷人更穷
- Android 获取手机的 IMEI 值 (设备标识码)
- 正则表达式常用语法速查+一个简单使用案例
- Apache 错误日记(Error Log)记录分析
- VMware VCP 认证考试电子版证书下载方式
- 氮化硼修饰导热复合物和碳纤维氮化硼涂层|六方氮化硼修饰石墨化氮化碳复合光催化剂|六方氮化硼(h-BN)修饰玻碳电极(GCE-BN) 氮化物