码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 记一次Mysql并发死锁


    数据准备

    1. create table t
    2. (
    3. id int(20) auto_increment
    4. primary key,
    5. cell varchar(20) null
    6. );
    1. INSERT INTO t (id, cell) VALUES (1, '11111111111');
    2. INSERT INTO t (id, cell) VALUES (2, '22222222222');
    3. INSERT INTO t (id, cell) VALUES (3, '33333333333');
    4. INSERT INTO t (id, cell) VALUES (4, '44444444444');
    5. INSERT INTO t (id, cell) VALUES (5, '55555555555');

    session参数设置

    1. //手动提交
    2. set session autocommit=0;

    模拟并发

    session1

    1. start TRANSACTION;
    2. INSERT INTO t(cell) VALUES('44444444');
    3. UPDATE t set cell = 123 WHERE cell = '44444444' ;

    session2

    1. start TRANSACTION;
    2. INSERT INTO t(cell) VALUES('5555555');
    3. UPDATE t set cell= 456 WHERE cell = '5555555' ;

    多个终端session模拟并发事务

    时间序号session1session2
    1start TRANSACTION;
    2INSERT INTO t(cell) VALUES('44444444');
    3
    start TRANSACTION;
    4
    INSERT INTO t(cell) VALUES('5555555');
    5
    UPDATE t set cell = 123 WHERE cell = '44444444' ;
    6
    UPDATE t set cell= 456 WHERE cell = '5555555' ;

    结果

    • 当运行到事务1的update时,发生了等待
    • 当运行到事务2的update时,发生了死锁

    问题分析

    根据show engine innodb status查询 

     可见Transaction1与Transaction2 同时锁住了同一部分,而且是locak_mode X rec bur not gap Record lock

    事务1的insert产生了一个插入意向锁(insert 会对插入的这条记录加排他记录锁,在加记录锁之前还会加一种 GAP 锁,叫做插入意向锁),事务2的insert也产生了一个插入意向锁(不会被互相锁住,因为数据行并不冲突),此时事务1再进行update语句,因未走索引,导致扫全表,而在扫到事务2插入那条数据时,行锁与插入意向锁冲突了,导致事务1需要等待事务2释放插入意向锁而进行等待。事务2在进行update时,也同样需要扫全表,但是全表都被事务1的update锁住了,事务2需要等待 等待事务2释放插入意向锁的 事务1 的行锁 释放,因此发生了死锁

    解决方法:在cell列建立索引

  • 相关阅读:
    Java之Map、三种Map遍历方式、HashMap、TreeMap、IO流、Properties、反射、获取类对象的三种方式、注解、元注解、工厂模式、装饰器
    冲刺十五届蓝桥杯P0002 日期统计
    5.机器学习-十大算法之一岭回归(Ridge)算法原理讲解
    【Android Studio】简单的QQ登录界面
    移远EC600U-CN开发板 day03
    Go 命令大全:全面解析与实践
    day05_编译原理学习
    揭秘GaussDB(for Redis):全面对比Codis
    ARC147D Sets Scores
    R语言和医学统计学(7):多元线性回归
  • 原文地址:https://blog.csdn.net/weixin_35973945/article/details/126484242
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号