记一次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引发的死锁问题相关推荐

  1. 外键字段未建索引引发的死锁

    现象:一个很简单的程序在压力测试过程中发现死锁,查看trace文件,发现如下信息: Deadlock graph: ---------Blocker(s)-------- ---------Waite ...

  2. 记一次升级Oracle驱动引发的死锁

    问题描述 近期项目需要从虚拟机环境迁移到容器环境,其中有一个项目在迁移到容器环境之后的两天之内出现了2次"死锁(deadlock)"的问题,部分关键日志如下: Found one ...

  3. oracle大数据量更新引发的死锁问题解决方法及oracle分区和存储过程的思考

    前言 前几天上午在对数据库的一张表进行操作的时候,由于这张表是按照时间的一张统计表,正好到那天没有测试数据了,于是我想将表中所有的时间,统一更新到后一个月,于是对80w条数据的更新开始了.整个过程曲折 ...

  4. mysql Insert on duplicate引发的死锁

    表 CREATE TABLE `test_dup` ( `id` int(11) NOT NULL AUTO_INCREMENT, `num` int(10) unsigned DEFAULT NUL ...

  5. Java线上问题排障:Linux内核bug引发JVM死锁导致线程假死

    Java本质上还是离不开操作系统,一来Java源码是用C/C++实现的,二来java进程还是需要依附于操作系统和硬件资源,有时候一些问题是操作系统级别导致的,下面的整个事件是源自一则真实的线上案例. ...

  6. bug诞生记——信号(signal)处理导致死锁

    这个bug源于项目中一个诡异的现象:代码层面没有明显的锁的问题,但是执行时发生了死锁一样的表现.我把业务逻辑简化为:父进程一直维持一个子进程.(转载请指明出于breaksoftware的csdn博客) ...

  7. sql server一个查询语句引发的死锁

    程序错误日志大量的报死锁错误,去数据库错误日志查看确实有很多死锁(应在数据库实例启动时执行dbcc traceon(1222,-1)开启死锁跟踪): 04/29/2016 14:07:51,spid3 ...

  8. winform 让他间隔一段时间 执行事件 且只执行一次_记一次golang定时器引发的诡异错误...

    作为一只在9127工作制下摸鱼的程序猿,周六自然是愉快的加班了.一早上除了一位新同学在我们的"敏捷迭代"下错删了接口之外没什么大事. 临近中午,突然隔壁组大佬找到我,表示有个go语 ...

  9. Mysql并发插入引发的死锁

    案发现场 项目中有一张业务关联表t_biz_ref,最近给该表建立了复合索引,测试阶段并发执行插入操作频繁出现死锁情况. t_biz_ref表结构 CREATE TABLE `t_biz_ref` ( ...

最新文章

  1. Windows自带certutil工具校验用法
  2. MySQL SHOW TABLE STATUS 获取表的信息
  3. 硬核NeruIPS 2018最佳论文,一个神经了的常微分方程
  4. 除了缓存,Redis 都解决了哪些问题?
  5. 在python中 函数赋值给变量时,需要注意的几个事项
  6. scala学习笔记-集合操作(15)
  7. 用户用户组及权限管理
  8. 04 16 团队竞技(第二场) 赛后总结
  9. 前端学习之HTML基本标签介绍
  10. strcore.cpp(156) 内存泄漏
  11. 什么? 搞不定 Redis 分布式锁?
  12. 【数据结构笔记】Leetcode买卖股票的最佳时机 系列总结
  13. 【图像融合】基于matlab GUI小波变换彩色图像融合(带面板)【含Matlab源码 782期】
  14. 能量谱 matlab,频谱、幅度谱、功率谱和能量谱含义
  15. 供应链管理 MOOC学习笔记(全)
  16. 团队管理(一)-会议纪要的高效记录和执行
  17. 金山词霸2007升级v10.0.0.4
  18. 黑苹果开机界面的启动项设置
  19. 主力吸筹的两种模式以及躺赢股市的三种票
  20. 如何把阿拉伯数字转换为中文大写?

热门文章

  1. VMware Workstation15配置虚拟网络编辑器固定IP地址
  2. 办工长时间使用计算机复印机,项目经理部管理制度汇编
  3. R入门(一)----读取数据、查看数据
  4. git 与github配置(老师详细版)
  5. 有钱人抢豪宅,普通人不敢消费:社会在割裂,富人更富,穷人更穷
  6. Android 获取手机的 IMEI 值 (设备标识码)
  7. 正则表达式常用语法速查+一个简单使用案例
  8. Apache 错误日记(Error Log)记录分析
  9. VMware VCP 认证考试电子版证书下载方式
  10. 氮化硼修饰导热复合物和碳纤维氮化硼涂层|六方氮化硼修饰石墨化氮化碳复合光催化剂|六方氮化硼(h-BN)修饰玻碳电极(GCE-BN) 氮化物