美文网首页
2020-04-08数据库死锁问题排查

2020-04-08数据库死锁问题排查

作者: bossLyre | 来源:发表于2020-04-08 23:10 被阅读0次

在测试同学测试过程中偶然发现日志中出现异常死锁日志如下:

出现问题后,立刻定位日志,排查死锁原因。以下为排查过程,图片不是很清晰,也不知道是为什么?

测试环境日志

1. 登录测试服务器使用命令show engine innodb status,查看innodb锁状态等相关信息。

2.定位到死锁日志,查看死锁相关事务的锁状态以及锁相关的信息,持有状态等。

事务1

innodb锁状态事务1

事务2

innodb锁状态事务2

分析发现,通过lock_mode X waiting 可以判断出来,事务1 在等待X 排他锁(此锁是加在唯一索引上)事务2 持有X锁(唯一索引上的X锁),但是由于此insert 使用了ON DUPLICATE KEY UPDATE UPDATE_COUNT = (UPDATE_COUNT+1) ,原理是,唯一索引冲突时只更新次数 不插入数据, 所以导致在事务2持有X锁后,还需要获取插入意向锁,专业术语,先做UK冲突检测,也就是日志中事务2上面的 lock_mode X locks gap before rec insert intention waiting, 因为对同一个字段的锁的申请是需要排队的,因为在事务1里已经在申请X排队,所以事务2申请S意向锁要X锁后排这,这就导致了事务1和事务2循环等待,导致死锁。

此问题的根本原因是,批量插入时,由于业务需要使用ON DUPLICATE KEY UPDATE来处理当唯一索引或者主键冲突时,只更新业务记录的次数,导致A-insert语句在和B-insert语句并发时,A和B操作的唯一索引相同(出现相同insert是因为过滤数据时未做排重处理),引起以上锁竞争场景,同学们引以为戒。

相关文章

  • 2020-04-08数据库死锁问题排查

    在测试同学测试过程中偶然发现日志中出现异常死锁日志如下: 出现问题后,立刻定位日志,排查死锁原因。以下为排查过程,...

  • 面对数据库死锁差点跪

    阅读原文:面对数据库死锁差点跪 数据库死锁这个问题不知道你有没有遇到过呢?一旦遇到该如何排查问题呢? 环境: My...

  • mysql 问题排查常用方法

    输出数据当前状态 可用于排查死锁问题,锁定行数等问题 查询数据库连接信息 查询事务信息 查询数据库锁等待信息 手动...

  • 数据库死锁排查

    1 数据库死锁排查 select*frominformation_schema.innodb_trx 2 kill...

  • 死锁问题排查

    首先使用jps查询进程ID然后使用jstack和进程ID查询堆栈日志信息。

  • 死锁问题排查

    最近在处理现场问题中偶然发现从日志中发现事务间死锁,与以往认知不大相符,故而进行记录。1.死锁死锁一般指的是两个事...

  • jstack命令:教你如何排查多线程问题

    这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我...

  • java死锁问题排查

    首先熟悉一下jstack命令的用法,主要参数有-F -l -m 如下图: 模拟一段死锁的java代码,如下: ``...

  • MySQL死锁问题排查

    概述 在开发中经常用到的mysql数据库,mysql作为开源的数据库有很多优越的地方;大家可以不了解其中的原理,但...

  • 死锁与问题排查

    本篇文章从Java线程、锁层面去考虑考虑死锁。 死锁:多个线程,彼此持有对方需要的锁资源,谁也不肯释放,谁也无法进...

网友评论

      本文标题:2020-04-08数据库死锁问题排查

      本文链接:https://www.haomeiwen.com/subject/yxdfmhtx.html