mysql并发死锁问题解决
一般根据多条件过滤后更新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并发死锁问题解决相关推荐
- 记一次Mysql并发死锁,引出的问题及讨论
这几天,在查看文章时,发现了一个Mysql并发的问题,在一开始仅仅凭借眼睛去查看时,并未发现问题及解决方法,于是我们对其进行了具体实际操作和测试: (想自学习编程的小伙伴请搜索圈T社区,更多行业相关资 ...
- mysql 并发死锁_Mysql并发时经典常见的死锁原因
Mysql并发时经典常见的死锁原因 更新时间:2017-06-07 00:17:21 1256次阅读 评论 0 1.mysql都有什么锁 MySQL有三种锁的级别:页级.表级.行级. 表级锁:开销小, ...
- 一次MySQL死锁问题解决
一次MySQL死锁问题解决 一.环境 CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日 ...
- mysql 死锁 代码_MySQL死锁问题解决的代码详细介绍
一次MySQL死锁问题解决 一.环境CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日志 ...
- MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)
MySQL事务原理分析(ACID特性.隔离级别.锁.MVCC.并发读异常.并发死锁以及如何避免死锁) 一.事务 目的 组成 特征 事务空间语句 二.ACID特性 原子性(A) 隔离性(I) 持久性(d ...
- MySQL 遇到的死锁问_一个罕见的MySQL redo死锁问题排查及解决过程
原标题:一个罕见的MySQL redo死锁问题排查及解决过程 作者:张青林,腾讯云布道师.MySQL架构师,隶属腾讯TEG-基础架构部-CDB内核开发团队,专注于MySQL内核研发&相关架构工 ...
- 关于MySQL的死锁问题
本文来说下关于MySQL的死锁问题 文章目录 什么是死锁 InnoDB锁类型 间隙锁( gap lock ) next-key lock 意向锁( Intention lock ) 插入意向锁( In ...
- mysql 代替不明_所有的死锁,都是不明就里的循环。又一必须升级MySQL的死锁问题!!!...
原标题:所有的死锁,都是不明就里的循环.又一必须升级MySQL的死锁问题!!! 去年年底到今年年初,线上发生了3次MySQL数据库hang住的情况.在内部,我们将其称为半死不活的场景.具体的表现表现如 ...
- mysql数据库死锁几种情况
mysql数据库死锁的产生原因及解决办法 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会 ...
最新文章
- 新手探索NLP(二)
- 8. An Introduction to MCMC for Machine Learning (4)
- 民非企业盈利怎么处理_对企业法人无力偿还债务时要怎么处理,如何解决?
- 插入排序算法 java_排序算法实现-插入排序(Java版本)
- api 另一窗体 之上_12 个设计 API 的安全建议,不要等出事儿了“捶胸顿足”
- UITableView自动计算图片的高度 SDWebImage
- 多项式曲线,分段曲线,曲线参数化,平面曲线,插值方法的样条曲线
- 三维地图制作教程,可以用于3D打印
- HTML龙卷风特效代码
- FTP 通过cmd命令上传下载文件
- Alpha阶段测试报告
- 阿维塔以情感智能陪伴用户“悦己而行”,为用户创造悦己生活
- linux怎么查看当前系统版本号,Linux下怎么查看当前系统的版本
- 获取月份的第一天和最后一天
- 物联网卡不能上网是怎么回事?
- antd Upload组件上传状态一直处于uploading
- 动起来!好玩的CSS抖动样式 – CSS Shake
- 裁员、年终奖减半:在公司打工,你永远不知道意外和明天哪个先来
- 唯链品牌重塑全球发布会在新加坡成功举办
- css如何让背景上下居中显示,CSS有哪些方式可以实现垂直居中?
热门文章
- 【报告分享】2021人才资本趋势报告:重塑时代-BOSS直聘.pdf(附下载链接)
- 绝对不能错过!计算机视觉Polygon Mesh Processing读书笔记——3
- 【字节跳动-搜索】22秋招提前批/社招 内推来了!直推到组!全程跟进!
- qt 进度条最小_QT:圆形进度条设计
- java程序设计_Java程序设计-Object类(笔记)
- java jobkey_Java JobBuilder.newJob方法代码示例
- 点击率预估与冷启动(二)
- Python提示错误 module 'request' has no attribute 'urlretrieve'
- nginx 代理静态资源报 403
- android sim卡分析,Android 判断SIM卡属于哪个移动运营商详解及实例