1、死锁日志

2018-10-23T07:16:23.919555+08:00 478808 [Note] InnoDB: Transactions deadlock detected, dumping detailed information.

2018-10-23T07:16:23.919573+08:00 478808 [Note] InnoDB:

*** (1) TRANSACTION:

TRANSACTION 638350242, ACTIVE 0 sec starting index read

mysql tables in use 1, locked 1

LOCK WAIT 18 lock struct(s), heap size 1136, 6 row lock(s), undo log entries 2

MySQL thread id 482727, OS thread handle 139949379430144, query id 1038382163 10.205.72.161 ucp updating

update ccp_order_info_1 set bill_push_status = 1 where partner_id = '80640511' and  order_code in

(  'UCP181023071619030500' , 'UCP181023071613030491', 'UCP181023071604030490', 'UCP181023071558030489' )

2018-10-23T07:16:23.919607+08:00 478808 [Note] InnoDB: *** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 383 page no 9655 n bits 104 index PRIMARY of table `ccp`.`ccp_order_info_1` /* Partition `p201810` */ trx id 638350242 lock_mode X locks rec but not gap waiting

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

0: len 8; hex fd67828666135000; asc  g  f P ;;

1: len 4; hex 5bce5a3d; asc [ Z=;;

2: len 6; hex 0000260c73a3; asc   & s ;;

3: len 7; hex 28000000230937; asc (   # 7;;

4: len 21; hex 554350313831303233303731363133303330343931; asc UCP181023071613030491;;

... // 省略后续82个字段的信息

TRANSACTION 638350243, ACTIVE 0 sec fetching rows

mysql tables in use 1, locked 1

14 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1

MySQL thread id 478808, OS thread handle 139949392209664, query id 1038382165 10.205.72.157 ucp updating

UPDATE ccp_order_info_1 SET order_Status=1,error_Flag='1',push_time='2018-10-23 07:16:23.91'  WHERE partner_id = '80640511' And ORDER_ID =

9036334691091959808

2018-10-23T07:16:23.921748+08:00 478808 [Note] InnoDB: *** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 383 page no 9655 n bits 112 index PRIMARY of table `ccp`.`ccp_order_info_1` /* Partition `p201810` */ trx id 638350243 lock_mode X locks rec but not gap

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

0: len 8; hex fd67828666135000; asc  g  f P ;;

1: len 4; hex 5bce5a3d; asc [ Z=;;

2: len 6; hex 0000260c73a3; asc   & s ;;

3: len 7; hex 28000000230937; asc (   # 7;;

4: len 21; hex 554350313831303233303731363133303330343931; asc UCP181023071613030491;;

... 省略后面82个字段的信息

2018-10-23T07:16:23.923431+08:00 478808 [Note] InnoDB: *** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 383 page no 9655 n bits 104 index PRIMARY of table `ccp`.`ccp_order_info_1` /* Partition `p201810` */ trx id 638350243 lock_mode X locks rec but not gap waiting

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

0: len 8; hex fd67a62566135000; asc  g %f P ;;

1: len 4; hex 5bce5a34; asc [ Z4;;

2: len 6; hex 0000260c73a2; asc   & s ;;

3: len 7; hex 27000040030785; asc '  @   ;;

4: len 21; hex 554350313831303233303731363034303330343930; asc UCP181023071604030490;;

... 省略后面82个字段的信息

2018-10-23T07:16:23.925041+08:00 478808 [Note] InnoDB: *** WE ROLL BACK TRANSACTION (2)

上面是两个事物发生死锁的日志,关键日志行分析如下:

1、*** (1) TRANSACTION:第一个事务消息开始。

2、LOCK WAIT 18 lock struct(s), heap size 1136, 6 row lock(s), undo log entries 2

18个锁等待结构体,6行被锁定,事务内已经生成了 2个undo项。

3、MySQL thread id 482727, OS thread handle 139949379430144, query id 1038382163 10.205.72.161 ucp updating

mysql中对应的线程ID为482727、操作系统的线程ID为139949379430144,查询id1038382163 ,线程状态:更新中。

4、update ccp_order_info_1 set bill_push_status = 1 where partner_id = '80640511' and  order_code in  (  'UCP181023071619030500' , 'UCP181023071613030491', 'UCP181023071604030490', 'UCP181023071558030489' )

当前事务SQL,后文也得该语句执行需申请锁而被阻塞。

5、2018-10-23T07:16:23.919607+08:00 478808 [Note] InnoDB: *** (1) WAITING FOR THIS LOCK TO BE GRANTED:

SQL语句中,需要申请的锁(无法立即获取锁信息)

6、RECORD LOCKS space id 383 page no 9655 n bits 112 index PRIMARY of table `ccp`.`ccp_order_info_1` /* Partition `p201810` */ trx id 638350243 lock_mode X locks rec but not gap

需要申请的行锁信息:表空间ID为383,页为9655,在112个字节开始,需要锁定的索引名为(ccp_order_info_1)的主键索引,事务ID为638350243,锁的类型为lock_mode X locks rec but not gap waiting(行级别的排他锁,并不是间隙锁)。

7、Record lock, heap no 32 PHYSICAL RECORD: n_fields 86; compact format; info bits 0

0: len 8; hex fd67828666135000; asc  g  f P ;;

1: len 4; hex 5bce5a3d; asc [ Z=;;

2: len 6; hex 0000260c73a3; asc   & s ;;

3: len 7; hex 28000000230937; asc (   # 7;;

4: len 21; hex 554350313831303233303731363133303330343931; asc UCP181023071613030491;;

... 省略后面82个字段的信息

请求行锁所对应的物理数据(真实的行数据),从这里也开以看出,这里申请order_no='UCP181023071613030491' 该行数据的行锁。

8、2018-10-23T07:16:23.921701+08:00 478808 [Note] InnoDB: *** (2) TRANSACTION:

接下来看第二个事务的信息,根据上文的分析,事务二在执行的SQL语句为:UPDATE ccp_order_info_1 SET order_Status=1,error_Flag='1',push_time='2018-10-23 07:16:23.91'  WHERE partner_id = '80640511' AndORDER_ID=         9036334691091959808 根据order_id更新1条数据。

9、2018-10-23T07:16:23.921748+08:00 478808 [Note] InnoDB: *** (2) HOLDS THE LOCK(S):

记录事务二已持有的锁信息:

10、2018-10-23T07:16:23.921748+08:00 478808 [Note] InnoDB: *** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 383 page no 9655 n bits 112 index PRIMARY of table `ccp`.`ccp_order_info_1` /* Partition `p201810` */ trx id 638350243 lock_mode X locks rec but not gap

发现事务二持有的锁 ,正是事务一急切响应的锁,即order_no=''UCP181023071613030491'的主键索引,即该索引对应的行数据。

11、2018-10-23T07:16:23.923431+08:00 478808 [Note] InnoDB: *** (2) WAITING FOR THIS LOCK TO BE GRANTED:

显示事务二需要申请的锁。

其主要是申请记录UCP181023071604030490的主键索引,然后mysql立马检测到发生了索引,因为该锁已经被事务1所持有,innodb会选择回滚一个事务,解除死锁,从日志看出,innodb选择将事务二进行回滚。

为什么事务二会去申请记录UCP181023071604030490行锁呢?从哪里可以看出事务1已经持有记录UCP181023071604030490的行锁呢?

死锁日志中,没有事务一中输出事务1当前所持有的行锁,故我们只能从如下信息进行推论:

LOCK WAIT 18 lock struct(s), heap size 1136, 6 row lock(s), undo log entries 2

MySQL thread id 482727, OS thread handle 139949379430144, query id 1038382163 10.205.72.161 ucp updating

update ccp_order_info_1 set bill_push_status = 1 where partner_id = '80640511' and  order_code in

(  'UCP181023071619030500' , 'UCP181023071613030491', 'UCP181023071604030490', 'UCP181023071558030489' )

undo log entries 2,创建了2个undo条目,猜测两条update,与in中最后两个条目吻合,故认为上述推论可信。第二个问题,为什么事务二会去申请UCP181023071604030490的行锁,应该是事务2中还会有根据order_id去更新UCP181023071604030490该行的SQL语句,与项目组确认代码后分析,确实是有for循环对多条数据进行更新,符合推论,死锁问题得到完成分析。

死锁原因分析:

1、事务1根据order_no(二级索引)更新多条记录,其加锁顺序:

UCP181023071558030489行:先申请 order_no_index , 再申请 primary_index (主键索引)申请成功

UCP181023071604030490行:先申请 order_no_index, 再申请 primary_index (主键索引)  申请成功

UCP181023071613030491行:先申请 order_no_index, 再申请 primary_index(主键索引)       order_no_index 申请成功,primary_index 排队等待

UCP181023071619030500行:先申请 order_no_index, 再申请 primary_index(主键索引)

2、事务2是根据主键ID循环来更新多条记录,其加锁顺序为:

UCP181023071613030491行:申请 primary_index(主键索引),然后再申请UCP181023071604030490 的主键索引,事务一,二相互持有各自需要锁,死锁发生。

解决方案:

1、同表更新,用唯一字段更新, 要么order_id ,要么order_no

2、事务对多个数据更新操作,先集合排序,顺序加锁,避免死锁。

mysql8.0.13可以用在生产环境_(13)生产环境出现大量DB死锁相关推荐

  1. mysql8.0安装及配置超详细教程_系统城教你mysql8.0安装与配置教程

    一.下载mysql 安装mysql有两种方式,一种是下载安装包安装,另一种是下载压缩包解压配置,这里使用安装包方式. 进去后点击下面的Download 点击No thinks进入下载 二.安装mysq ...

  2. python工作者工作环境_搭建python环境

    搭建python环境 windows下可以安装enthought 集成的 EPDFree32安装包安装python用这个集成了基本所有需要的插件和环境. 装完以后可以运行桌面上pylab程序进入pyt ...

  3. java环境_配置java环境变量

    1.找到此电脑我的电脑右键属性. 2.点击高级系统设置. 3.点击环境变量. 4.点击新建. 5.创建变量名JAVA_HOME必须是大写,变量值找到你的jdk的根目录复制下来,然后粘贴进去,点击确定. ...

  4. python 打包 无需安装运行环境_无需Python环境,小白也可以运行的抢票程序

    阅读文本大概需要 5 分钟. 又到周末了,pk 哥抽空对抢票程序作了优化,并把优化后的程序做打包处理,打包后没有 Python 环境的电脑也可以正常运行程序了.前两篇关于抢票的文章没看可点下方链接查看 ...

  5. linux服务器配置python环境_服务器python环境配置福利,CentOS ,Linux 一键下载python3和环境配置...

    很多新手对于linux 系统很是费解,通常下一个环境就需要大半天,中途还会出现各种这样的问题 ,干脆写一个脚本一键配置python环境 shell 脚本start.sh: #!/bin/bash yu ...

  6. 在线的python运行环境_在线Python环境(Azure Notebooks)

    前言 上文说道了anaconda的安装和使用.对于动手能力较差的小伙伴们来说,安装还是太过麻烦,一出现问题也不知道如何查错,然后就从入门选择放弃. 说起编程的两个拦路虎,一个就是环境配置,另一个就是编 ...

  7. mysql-8.0.14zip怎么使用_mysql 8.0.14 安装配置方法图文教程(通用)

    mysql服务8.0.14安装(通用),供大家参考,具体内容如下 安装环境:windows 安装步骤: 1.下载zip安装包 2.解压zip安装包 3.配置环境变量 4.添加配置文件 5.cmd安装m ...

  8. mysql-8.0.14图文安装_mysql8.0.14安装配置方法图文教程(通用)

    mysql服务8.0.14安装(通用),供大家参考,具体内容如下 安装环境:windows 安装步骤: 1.下载zip安装包 2.解压zip安装包 3.配置环境变量 4.添加配置文件 5.cmd安装m ...

  9. mysql8.0 安装与卸载

    MySQL-mysql 8.0.11安装教程 网上的教程有很多,基本上大同小异.但是安装软件有时就可能因为一个细节安装失败.我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的. 安装环境 ...

最新文章

  1. php lucene索引,用PHP调用Lucene包来实现全文检索_PHP教程
  2. python输出到文件
  3. 【Qt开发】Qt标准对话框之QMessageBox
  4. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(5) - 控制转移指令
  5. 项目中遇到的各种bug和踩过的坑
  6. 【图像分割】基于matlab超像素SFFCM图像分割【含Matlab源码 1374期】
  7. 为了进大厂,韩顺平Java教程百度云
  8. siteweaver android动易客户端,动易SiteFactory实现SiteWeaver置顶功能
  9. 图形推理1000题pdf_这7道幼儿园数学思维题,能答对一半智商肯定不低
  10. 锐起无盘服务器蓝屏死机,锐起无盘蓝屏怎么办?各类无盘蓝屏怎么办?
  11. html日期选择器小日历样式,9 款样式华丽的 jQuery 日期选择和日历控件
  12. python dateutil安装_Python时间处理-dateutil模块
  13. 微信公众号模板消息 换行
  14. 独角兽云发卡系统源码下载
  15. lenovo服务器换系统重装系统_联想电脑重装系统详细步骤?
  16. 高一计算机会考英语作文,高一考试英语作文常考题目及范文
  17. 达梦数据库ZYJ实例安装初始化
  18. matlab生成曲线程序,Matlab绘制频散曲线程序代码(20210119130722).docx
  19. Visual Studio 2019重新安装问题
  20. 苹果Mac 无法读写NTFS格式的U盘或移动硬盘?一次解决

热门文章

  1. 不要束缚:为什么我们会错过GitHub条纹
  2. ubuntu16.04安装lua环境
  3. 解决 idea Method threw ‘java.lang.NoClassDefFoundError‘ exception. Cannot evaluate xxx toString 问题
  4. 这5个有趣的Python库带你花式编码!
  5. 如何快速查找下载java项目所需jar包
  6. 4.3.2 用jQuery进行异步加载(2)
  7. 《Pytorch - BP全连接神经网络模型》
  8. 漫步数理统计十二——随机变量的期望
  9. 调用者保存寄存器和非调用者保存寄存器
  10. leetcode —— 1038. 从二叉搜索树到更大和树