美文网首页我爱编程
记一次mysql死锁问题

记一次mysql死锁问题

作者: 琥珀灬 | 来源:发表于2018-05-24 12:18 被阅读0次



 场景:innodb下不同的事务进行更新和插入操作导致数据库死锁,代码如下,在批量插入之前,进行了逻辑删除操作,这段代码在并发情况下出现死锁

堆栈异常: Deadlock found when trying to get lock; try restarting transaction; 更新操作sql 批量插入sql

代码分析

activityId为外键,有外键索引,如果是行级锁肯定不会出现死锁,所以更新的时候肯定不止锁了一条数据

代码中更新操作的是非唯一索引列在innoDB引擎下会触发 next-key lock(间隙锁)。

举例: 表t中有非唯一索引列 test_id为 1, 10, 18, 22, 26的5条数据,此时模拟操作:

事务A 删除一条不存在的数据,数据库就会去找从左开始找最近的索引值

delete from t where test_id= 27;

事务B 删除一条不存在的数据,数据库就会去找从左开始找最近的索引值

delete from t where test_id= 28;

此时事务A和B就会分别产生一个(26,正无穷)间隙锁,然后继续操作

事务A

INSERT INTO t VALUES(27);

此时事务A阻塞,因为事务B在删除操作时拥有了区间锁

事务B

INSERT INTO t VALUES(28);

此时事务B就会死锁,因为事务A在删除操作时拥有了区间锁

解决之道

1、删除时先判断数据是否存在

2、删除和插入分两个事务处理

3、将事务隔离级别设置为读已提交

如果更新数据库存在数据就不会出现死锁,在DELETE FROM ... WHERE ... 和 UPDATE ... WHERE ... 在搜索遇到的每条记录上设置一个独占的间隙锁。 如果通过索引搜索到唯一行就会产生一个索引记录锁。

INSERT 语句对插入的行设置排他(独占)锁。这个锁是一个索引记录锁,而不是间隙锁,并且不会阻止其他会话在插入的行之前区间中插入数据。

死锁,innoDB检测到会剔除一个事务回滚,让另外一个事务完成。

相关文章

  • 记一次mysql死锁问题

    场景:innodb下不同的事务进行更新和插入操作导致数据库死锁,代码如下,在批量插入之前,进行了逻辑删除操作,这段...

  • MySQL笔记-锁、事务与并发控制

    MySQL服务器逻辑架构 MySQL并发控制 MySQL死锁问题 MySQL中的事务

  • 记一次Mysql死锁问题排查流程

    第一次在实际生产环境遇到死锁问题,从开始的懵逼状到找到并解决该问题,经历了无数次的百度。。。 项目用的MySQL数...

  • 记一次mysql死锁问题的排查

    最近在工作中遇到一些死锁的问题,所以简单研究了一下后,写下一篇文章分享一下。 1.如何查看看mysql中出现的死锁...

  • 记一次线上mysql死锁分析(二)

    记录一次比较诡异的mysql死锁日志。系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查...

  • 记一次线上mysql死锁分析(一)

    记录一次比较诡异的mysql死锁日志。系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查...

  • 记一次死锁问题

    背景:前系统跑定时任务,由于是循环插入、查询、修改同时存在,其中一个log表中数据存在500多万,做了修改操作,但...

  • 漫谈死锁

    一、前言 每个MySQL DBA和开发大概率都会遇到死锁问题,本文是自己对死锁相关知识总结,介绍死锁是什么,MyS...

  • 解决一次mysql死锁问题

    背景 多线程开启事务处理。每个事务有多个update操作和一个insert操作(都在同一张表)。 DDL(删除了一...

  • Mysql死锁如何排查:insert on duplicate死

    前言 遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问...

网友评论

    本文标题:记一次mysql死锁问题

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