Mysql对死锁的处理
什么是死锁
官方定义如下: 两个事务都持有对方需要的锁, 并且在等待对方释放, 并且双方都不会释放自己的锁。
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行锁在并发性能上远远要高于表锁页锁。
在使用方面可以尽量做到以下几点;
- 控制事务大小, 减少锁定的资源量和锁定时间长度。
- 所有的数据检索都通过索引来完成, 从而避免因为无法通过索引加锁而升级为表锁。
- 减少基于范围的数据检索过滤条件, 避免因为间隙锁带来的负面影响而锁定了不该锁定的数据。
- 在业务条件允许下, 尽量使用较低隔离级别的事务隔离。 减少隔离级别带来的附加成本。
- 合理使用索引, 让innodb在索引上面加锁的时候更加准确。
- 在应用中尽可能做到访问的顺序执行
- 如果容易死锁, 就可以考虑使用表锁来减少死锁的概率
Mysql对死锁的处理相关推荐
- 关于MySQL的死锁问题
本文来说下关于MySQL的死锁问题 文章目录 什么是死锁 InnoDB锁类型 间隙锁( gap lock ) next-key lock 意向锁( Intention lock ) 插入意向锁( In ...
- mysql并发死锁问题解决
一般根据多条件过滤后更新update在高并发的时候会导致死锁,进而事务失败.解决办法就是为表增加主键,先查询出主键,再按主键更新,避免死锁. 这是因为mysql行级锁并不是直接锁记录,而是锁索引,如果 ...
- Mysql解决死锁的问题,防止阻塞
Mysql解决死锁的问题,防止阻塞 参考文章: (1)Mysql解决死锁的问题,防止阻塞 (2)https://www.cnblogs.com/ywjfx/p/12197563.html 备忘一下.
- mysql 代替不明_所有的死锁,都是不明就里的循环。又一必须升级MySQL的死锁问题!!!...
原标题:所有的死锁,都是不明就里的循环.又一必须升级MySQL的死锁问题!!! 去年年底到今年年初,线上发生了3次MySQL数据库hang住的情况.在内部,我们将其称为半死不活的场景.具体的表现表现如 ...
- MySQL 遇到的死锁问_一个罕见的MySQL redo死锁问题排查及解决过程
原标题:一个罕见的MySQL redo死锁问题排查及解决过程 作者:张青林,腾讯云布道师.MySQL架构师,隶属腾讯TEG-基础架构部-CDB内核开发团队,专注于MySQL内核研发&相关架构工 ...
- mysql数据库死锁几种情况
mysql数据库死锁的产生原因及解决办法 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会 ...
- mysql 数据库 死锁_Mysql数据库出现死锁的情况(一)
在临近上线之前,我们系统做了一次压力测试,发现有一个接口在高并发情况下会出现一个死锁的情况..首先申明-不是我写的,我只是帮忙排查下. 随着对Mysql锁的深入了解,于是就准备写几篇文章来记录下Mys ...
- 记一次mysql数据库死锁实验
概述 之前接触到的数据库死锁,很多都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁.借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景.今天不介绍死锁的基本 ...
- mysql 索引 死锁,由不同的索引更新解决MySQL死锁套路
前几篇文章介绍了用源码的方式来调试锁相关的信息,这里同样用这个工具来解决一个线上实际的死锁案例,下面小编来简单介绍下 前几篇文章介绍了用源码的方式来调试锁相关的信息,这里同样用这个工具来解决一个线上实 ...
- mysql元数据死锁日志_这个未修复的MySQL 5.7死锁Bug,你知道么?
破产码农 IT圈最会讲故事的网红 · 南山彭于晏 最近在生产上变更时遇到从机死锁的问题.表现的现象为:同一张的表的DROP TABLE操作进入了同一组.而由于并行复制,并且从机提交顺序需要保证与主机一 ...
最新文章
- java out.write ie8_整理一下最近遇到的ie8兼容问题
- 我们应该怎么使用网络中赋予我们的权限
- memcached客户端_对比Memcached和Redis,谁才是适合你的缓存?
- c++ 实例精通(1)
- Arduino--超声波
- [Java基础]Lambda表达式的省略模式
- 级差公排php如何_什么是专业级差?专业级差怎么安排专业?
- 某大学强制全员申报国自然,不提交就扣奖金!
- 机器学习两大派别--南大周志华
- layui 按钮点击一次后失效_electron-vue自定义边框后点击事件失效问题
- TypeScript学习笔记(五) - 泛型
- atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php
- 有源医疗器械电磁兼容入门知识汇总
- Scratch编程学习的好处
- 华为OS操作系统,最早今秋面世!
- 学会个人管理和自我管理必看的书籍推荐
- SPA(单页面应用)、路由模式
- 吐血整理:最受欢迎的250份学习资料,99%的DBA都收藏了!
- 区块链 - DAPP
- C语言入门题目2——对于给定字符,输出该字符的前驱字符和后继字符
热门文章
- 淘内淘外内容推广运营怎么做?
- git删除远程的分支
- A Mobility Model Based on Improved Artificial Potential Fields for Swarms of UAVs(论文翻译)
- 直线绘制算法-Bresenham算法
- 招聘报表分析怎么做?大公司都在用的招聘分析模型免费用
- 如何清理桌面缓存?(更新桌面图标失败解决办法)
- java抓取网页代码_java 抓取网页内容实现代码
- nashorn java_Java 8: Nashorn脚本引擎使用
- 用html语句超链接锚点使用,HTML 锚点超链接
- PPT笔记----PPT模板,去除母版的广告