码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MYSQL 根据唯一索引键更新死锁问题


    mysql 死锁问题及死锁权重分析

    问题发生过程:
    1、生产发现死锁一次
    语句为sql1:UPDATE table set  data = ‘123’ where business_no = 'ABC';

    该行数据的id=1, business_no = 'ABC'

    tablbe 字段

    id:主键 business_no为唯一索引字段,其他字段暂时无意义

    2、查找发生死锁问题原因

    上述sql在一个事务内,死锁必定有两把锁。

    最开始对锁的理解就是锁主键、不清楚是否有其他锁参与。

    网上搜索发现update的where条件为唯一索引时候,sql会同时获取两把锁,先获取唯一索引business_no的锁,再获取主键id的锁,所以必定同一时刻有先获取id锁,再获取唯一主键锁的sql。

    查找代码返现同一时刻,另外一个事务2执行了以下sql

    sql2:UPDATE table set  data = ‘123’ where id = 1;

    sql3:UPDATE table set  data = ‘123’ where business_no = ‘ABC’;

    现在发现了死锁原因:

    但是现象不复核预期

    sql 1 先唯一键锁、后 主键锁

    sql2 先主键锁 、sql3后唯一键锁

    理论是sql1 和 sql3 都有可能发生死锁,因为sq1在一个sql内,sql2、slq3是分开的,

    按预期sql3发生死锁错误的概率最大,但是代码发生了8次死锁全部是sql1发生了死锁。

    3、为啥sql1发生死锁

    第一步怀疑有其他sql参与了,但是没找到疑点sql。

    网上搜索发现了一个死锁权重的概念。

    大概意思是发生死锁根据算法确定权重,权重小的事务会回滚。

    感觉问题快找到了,猜想sql1事务内只有一个事务(他基本就是小权重的事务)。

    那接下来分析日志验证:

    事务2还执行了以下sql。

    sql4:UPDATE table2 set  data2 = ‘123’ where id = 1;

    在sql2和sql3之前还有sql4。

    那猜测有事务4  中sql5  UPDATE table2 set  data2 = ‘345’ where id = 1;

    让后搜索日志发现同一时间有有sql5。

    接下来实际验证:

    开启事务1:

    执行:sql2:UPDATE table set  data = ‘123’ where id = 1;

    执行sql4:UPDATE table2 set  data2 = ‘123’ where id = 1;

    开启事务2:

    执行slq1:UPDATE table set  data = ‘123’ where business_no = 'ABC';

    开启事务3:

    执行sql5:UPDATE table2 set  data2 = ‘345’ where id = 1;

    事务1:

    执行slq3:UPDATE table set  data = ‘123’ where business_no = ‘ABC’;

    发现必sql1必死锁异常且回滚,问题解决。

    4、问题总结

    msql行级锁加锁的过程。

    mysql发生死锁回滚的机制。

  • 相关阅读:
    Linux Shell编程--变量
    科技部等6部门发文,推动AI场景创新;『精益副业』教程序员优雅做副业;『可扩展系统』设计全教程;人物动作数据集;前沿论文 | ShowMeAI资讯日报
    webpack初体验
    Arduino与Proteus仿真-WiFi TCP客户端数据通信
    反编译jar包
    【机器学习】推荐系统
    Vue2.7正式发布!代号为:Naruto(火影忍者),原生支持 Composition API +终于可以在Vue2项目中使用Vue3的新特性了,真香~
    【DELM回归预测】基于matlab多元宇宙优化算法改进深度学习极限学习机数据回归预测【含Matlab源码 2230期】
    【读书笔记】【Effective C++】继承与面向对象设计
    智能安防监控如何助力汽车4S店信息化精细化管理?最大程度做到降本增效?
  • 原文地址:https://blog.csdn.net/weixin_41824658/article/details/133945723
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号