什么是死锁

官方定义如下: 两个事务都持有对方需要的锁, 并且在等待对方释放, 并且双方都不会释放自己的锁。

MySQL有两种死锁处理方式

  • 等待, 直到超时(innodb_lock_wait_timeout=50s) 。
  • 发起死锁检测, 主动回滚一条事务, 让其他事务继续执行(innodb_deadlock_detect=on) 。

由于性能原因, 一般都是使用死锁检测来进行处理死锁。

死锁检测

死锁检测的原理是构建一个以事务为顶点、 锁为边的有向图, 判断有向图是否存在环, 存在即有死锁。

回滚

检测到死锁之后, 选择插入更新或者删除的行数最少的事务回滚,
基于INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段来判断。

对于锁的建议

  • 收集死锁信息:
    利用命令 SHOW ENGINE INNODB STATUS查看死锁原因。
    调试阶段开启 innodb_print_all_deadlocks, 收集所有死锁日志。
  • 减少死锁:
    1.使用事务, 不使用 lock tables 。
    2.保证没有长事务。
    3.操作完之后立即提交事务, 特别是在交互式命令行中。
    4.如果在用 (SELECT … FOR UPDATE or SELECT … LOCK IN SHARE MODE), 尝试降低隔离级别。
    5.修改多个表或者多个行的时候, 将修改的顺序保持一致。
    6.创建索引, 可以使创建的锁更少。
    7.最好不要用 (SELECT … FOR UPDATE or SELECT … LOCK IN SHARE MODE)。
    8.如果上述都无法解决问题, 那么尝试使用 lock tables t1, t2, t3 锁多张表

对于事务的建议

innodb存储引擎由于实现了行级锁, 颗粒更小, 实现更复杂。
但是innodb行锁在并发性能上远远要高于表锁页锁。
在使用方面可以尽量做到以下几点;

  1. 控制事务大小, 减少锁定的资源量和锁定时间长度。
  2. 所有的数据检索都通过索引来完成, 从而避免因为无法通过索引加锁而升级为表锁。
  3. 减少基于范围的数据检索过滤条件, 避免因为间隙锁带来的负面影响而锁定了不该锁定的数据。
  4. 在业务条件允许下, 尽量使用较低隔离级别的事务隔离。 减少隔离级别带来的附加成本。
  5. 合理使用索引, 让innodb在索引上面加锁的时候更加准确。
  6. 在应用中尽可能做到访问的顺序执行
  7. 如果容易死锁, 就可以考虑使用表锁来减少死锁的概率

Mysql对死锁的处理相关推荐

  1. 关于MySQL的死锁问题

    本文来说下关于MySQL的死锁问题 文章目录 什么是死锁 InnoDB锁类型 间隙锁( gap lock ) next-key lock 意向锁( Intention lock ) 插入意向锁( In ...

  2. mysql并发死锁问题解决

    一般根据多条件过滤后更新update在高并发的时候会导致死锁,进而事务失败.解决办法就是为表增加主键,先查询出主键,再按主键更新,避免死锁. 这是因为mysql行级锁并不是直接锁记录,而是锁索引,如果 ...

  3. Mysql解决死锁的问题,防止阻塞

    Mysql解决死锁的问题,防止阻塞 参考文章: (1)Mysql解决死锁的问题,防止阻塞 (2)https://www.cnblogs.com/ywjfx/p/12197563.html 备忘一下.

  4. mysql 代替不明_所有的死锁,都是不明就里的循环。又一必须升级MySQL的死锁问题!!!...

    原标题:所有的死锁,都是不明就里的循环.又一必须升级MySQL的死锁问题!!! 去年年底到今年年初,线上发生了3次MySQL数据库hang住的情况.在内部,我们将其称为半死不活的场景.具体的表现表现如 ...

  5. MySQL 遇到的死锁问_一个罕见的MySQL redo死锁问题排查及解决过程

    原标题:一个罕见的MySQL redo死锁问题排查及解决过程 作者:张青林,腾讯云布道师.MySQL架构师,隶属腾讯TEG-基础架构部-CDB内核开发团队,专注于MySQL内核研发&相关架构工 ...

  6. mysql数据库死锁几种情况

    mysql数据库死锁的产生原因及解决办法 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会 ...

  7. mysql 数据库 死锁_Mysql数据库出现死锁的情况(一)

    在临近上线之前,我们系统做了一次压力测试,发现有一个接口在高并发情况下会出现一个死锁的情况..首先申明-不是我写的,我只是帮忙排查下. 随着对Mysql锁的深入了解,于是就准备写几篇文章来记录下Mys ...

  8. 记一次mysql数据库死锁实验

    概述 之前接触到的数据库死锁,很多都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁.借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景.今天不介绍死锁的基本 ...

  9. mysql 索引 死锁,由不同的索引更新解决MySQL死锁套路

    前几篇文章介绍了用源码的方式来调试锁相关的信息,这里同样用这个工具来解决一个线上实际的死锁案例,下面小编来简单介绍下 前几篇文章介绍了用源码的方式来调试锁相关的信息,这里同样用这个工具来解决一个线上实 ...

  10. mysql元数据死锁日志_这个未修复的MySQL 5.7死锁Bug,你知道么?

    破产码农 IT圈最会讲故事的网红 · 南山彭于晏 最近在生产上变更时遇到从机死锁的问题.表现的现象为:同一张的表的DROP TABLE操作进入了同一组.而由于并行复制,并且从机提交顺序需要保证与主机一 ...

最新文章

  1. java out.write ie8_整理一下最近遇到的ie8兼容问题
  2. 我们应该怎么使用网络中赋予我们的权限
  3. memcached客户端_对比Memcached和Redis,谁才是适合你的缓存?
  4. c++ 实例精通(1)
  5. Arduino--超声波
  6. [Java基础]Lambda表达式的省略模式
  7. 级差公排php如何_什么是专业级差?专业级差怎么安排专业?
  8. 某大学强制全员申报国自然,不提交就扣奖金!
  9. 机器学习两大派别--南大周志华
  10. layui 按钮点击一次后失效_electron-vue自定义边框后点击事件失效问题
  11. TypeScript学习笔记(五) - 泛型
  12. atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php
  13. 有源医疗器械电磁兼容入门知识汇总
  14. Scratch编程学习的好处
  15. 华为OS操作系统,最早今秋面世!
  16. 学会个人管理和自我管理必看的书籍推荐
  17. SPA(单页面应用)、路由模式
  18. 吐血整理:最受欢迎的250份学习资料,99%的DBA都收藏了!
  19. 区块链 - DAPP
  20. C语言入门题目2——对于给定字符,输出该字符的前驱字符和后继字符

热门文章

  1. 淘内淘外内容推广运营怎么做?
  2. git删除远程的分支
  3. A Mobility Model Based on Improved Artificial Potential Fields for Swarms of UAVs(论文翻译)
  4. 直线绘制算法-Bresenham算法
  5. 招聘报表分析怎么做?大公司都在用的招聘分析模型免费用
  6. 如何清理桌面缓存?(更新桌面图标失败解决办法)
  7. java抓取网页代码_java 抓取网页内容实现代码
  8. nashorn java_Java 8: Nashorn脚本引擎使用
  9. 用html语句超链接锚点使用,HTML 锚点超链接
  10. PPT笔记----PPT模板,去除母版的广告