一般根据多条件过滤后更新update在高并发的时候会导致死锁,进而事务失败。解决办法就是为表增加主键,先查询出主键,再按主键更新,避免死锁。

这是因为mysql行级锁并不是直接锁记录,而是锁索引,如果一条SQL语句用到了主键索引,mysql会锁住主键索引;如果一条语句操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引,如果没有主键则使用聚簇索引。如果更新的时候使用到多个索引则可能会导致死锁.https://bugs.mysql.com/bug.php?id=77209

规避办法就是update更新时避免使用多个索引,尽量使用单个索引(或主键)。我这个表没有主键,我就新增了个主键,update时先根据条件查出主键再根据主键更新状态,然后再没有出现更深死锁的问题了。

下面是定位过程:

新开发的并发模板执行功能发现状态更新有问题,有较大概率部分节点状态不更新。怀疑没执行或异常了,直接开启mysql执行日志,从日志里查看导致状态更新语句执行了没有。

开启之后,运行程序发现有个节点状态没更新,根据节点id去mysql执行日志里找下看到底执行了没有:

发现执行了,但是查询状态却仍然是没有更新。怀疑存储过程有问题,一看原来存储过程里捕获了异常,怪不得没有抛异常。

注释掉存储过程的异常捕获,再跑一次,这次异常抛出到程序在日志里可以看到,原来是mysql数据库死锁了导致事务回滚了,所以执行了,但是状态没有更新。

在数据库执行 show engine innodb status; 查询到如下死锁信息,两条update语句根据多个条件查询并更新,使用到了多个索引,并且有个主要索引的值也是相等的。

------------------------

LATEST DETECTED DEADLOCK

------------------------

2020-09-11 14:23:54 7fbb807e2700

*** (1) TRANSACTION:

TRANSACTION 2093530753, ACTIVE 0 sec starting index read

mysql tables in use 3, locked 3

LOCK WAIT 5 lock struct(s), heap size 1184, 3 row lock(s), undo log entries 1

MySQL thread id 443592, OS thread handle 0x7fb9eb451700, query id 87154676 192.168.129.118 root Searching rows for update

update etl_jobentry_status

set status = v_status,

result = v_result,

createdate=IF(v_status=0,NOW(),createdate) ,

enddate = NOW(),

verify_result = V_verify_result,

error_num = p_error_num

where id_jobentry = p_id_jobentry

and id_job = p_id_job

and id_batch = p_id_batch

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 107797 page no 11303 n bits 1120 index `index_id_job` of table `etl_test_1210`.`etl_jobentry_status` trx id 2093530753 lock_mode X waiting

Record lock, heap no 225 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

0: len 4; hex 800050cc; asc   P ;;

1: len 6; hex 0000913735c6; asc    75 ;;

*** (2) TRANSACTION:

TRANSACTION 2093530752, ACTIVE 0 sec fetching rows

mysql tables in use 3, locked 3

49 lock struct(s), heap size 6544, 6189 row lock(s), undo log entries 1

MySQL thread id 442593, OS thread handle 0x7fbb807e2700, query id 87154635 192.168.129.118 root Searching rows for update

update etl_jobentry_status

set status = v_status,

result = v_result,

createdate=IF(v_status=0,NOW(),createdate) ,

enddate = NOW(),

verify_result = V_verify_result,

error_num = p_error_num

where id_jobentry = p_id_jobentry

and id_job = p_id_job

and id_batch = p_id_batch

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 107797 page no 11303 n bits 1120 index `index_id_job` of table `etl_test_1210`.`etl_jobentry_status` trx id 2093530752 lock_mode X

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

0: len 8; hex 73757072656d756d; asc supremum;;

Record lock, heap no 225 PHYSICAL RECORD: n_fields 2; compact format; info bits 0

0: len 4; hex 800050cc; asc   P ;;

1: len 6; hex 0000913735c6; asc    75 ;;

参考:

https://blog.csdn.net/guanfengliang1988/article/details/80356648

https://blog.csdn.net/usst_lidawei/article/details/79494177

mysql并发死锁问题解决相关推荐

  1. 记一次Mysql并发死锁,引出的问题及讨论

    这几天,在查看文章时,发现了一个Mysql并发的问题,在一开始仅仅凭借眼睛去查看时,并未发现问题及解决方法,于是我们对其进行了具体实际操作和测试: (想自学习编程的小伙伴请搜索圈T社区,更多行业相关资 ...

  2. mysql 并发死锁_Mysql并发时经典常见的死锁原因

    Mysql并发时经典常见的死锁原因 更新时间:2017-06-07 00:17:21 1256次阅读 评论 0 1.mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小, ...

  3. 一次MySQL死锁问题解决

    一次MySQL死锁问题解决 一.环境 CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日 ...

  4. mysql 死锁 代码_MySQL死锁问题解决的代码详细介绍

    一次MySQL死锁问题解决 一.环境CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日志 ...

  5. MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)

    MySQL事务原理分析(ACID特性.隔离级别.锁.MVCC.并发读异常.并发死锁以及如何避免死锁) 一.事务 目的 组成 特征 事务空间语句 二.ACID特性 原子性(A) 隔离性(I) 持久性(d ...

  6. MySQL 遇到的死锁问_一个罕见的MySQL redo死锁问题排查及解决过程

    原标题:一个罕见的MySQL redo死锁问题排查及解决过程 作者:张青林,腾讯云布道师.MySQL架构师,隶属腾讯TEG-基础架构部-CDB内核开发团队,专注于MySQL内核研发&相关架构工 ...

  7. 关于MySQL的死锁问题

    本文来说下关于MySQL的死锁问题 文章目录 什么是死锁 InnoDB锁类型 间隙锁( gap lock ) next-key lock 意向锁( Intention lock ) 插入意向锁( In ...

  8. mysql 代替不明_所有的死锁,都是不明就里的循环。又一必须升级MySQL的死锁问题!!!...

    原标题:所有的死锁,都是不明就里的循环.又一必须升级MySQL的死锁问题!!! 去年年底到今年年初,线上发生了3次MySQL数据库hang住的情况.在内部,我们将其称为半死不活的场景.具体的表现表现如 ...

  9. mysql数据库死锁几种情况

    mysql数据库死锁的产生原因及解决办法 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会 ...

最新文章

  1. 新手探索NLP(二)
  2. 8. An Introduction to MCMC for Machine Learning (4)
  3. 民非企业盈利怎么处理_对企业法人无力偿还债务时要怎么处理,如何解决?
  4. 插入排序算法 java_排序算法实现-插入排序(Java版本)
  5. api 另一窗体 之上_12 个设计 API 的安全建议,不要等出事儿了“捶胸顿足”
  6. UITableView自动计算图片的高度 SDWebImage
  7. 多项式曲线,分段曲线,曲线参数化,平面曲线,插值方法的样条曲线
  8. 三维地图制作教程,可以用于3D打印
  9. HTML龙卷风特效代码
  10. FTP 通过cmd命令上传下载文件
  11. Alpha阶段测试报告
  12. 阿维塔以情感智能陪伴用户“悦己而行”,为用户创造悦己生活
  13. linux怎么查看当前系统版本号,Linux下怎么查看当前系统的版本
  14. 获取月份的第一天和最后一天
  15. 物联网卡不能上网是怎么回事?
  16. antd Upload组件上传状态一直处于uploading
  17. 动起来!好玩的CSS抖动样式 – CSS Shake
  18. 裁员、年终奖减半:在公司打工,你永远不知道意外和明天哪个先来
  19. 唯链品牌重塑全球发布会在新加坡成功举办
  20. css如何让背景上下居中显示,CSS有哪些方式可以实现垂直居中?

热门文章

  1. 【报告分享】2021人才资本趋势报告:重塑时代-BOSS直聘.pdf(附下载链接)
  2. 绝对不能错过!计算机视觉Polygon Mesh Processing读书笔记——3
  3. 【字节跳动-搜索】22秋招提前批/社招 内推来了!直推到组!全程跟进!
  4. qt 进度条最小_QT:圆形进度条设计
  5. java程序设计_Java程序设计-Object类(笔记)
  6. java jobkey_Java JobBuilder.newJob方法代码示例
  7. 点击率预估与冷启动(二)
  8. Python提示错误 module 'request' has no attribute 'urlretrieve'
  9. nginx 代理静态资源报 403
  10. android sim卡分析,Android 判断SIM卡属于哪个移动运营商详解及实例