MySQL笔记-死锁原理与分析及InnoDB中如何减少死锁
根据InnoDB的加锁规则(Record Lock、Gap Lock、meta data lock)可以写出不会发生死锁的SQL语句,也能定位出产生死锁的原因。
死锁产生的原因:
产生回路:两个或两个以上的事务在执行过程中,分别持有一把锁,然后再加一把锁(AB-BA)产生死锁。
加锁顺序不一致:两个或两个以上的事务并发执行(同一时刻),因争夺资源而造成的一种互相等待,产生死锁。
如下时序图为产生环路:
update操作会参数排他锁。
这里session1把id为1的行加了锁,session2,把ID为2的行加了锁,随后,session1拿id为2的数据,而session2拿id为1的数据,这样就产生了死锁。
下面用mysql来演示下:
表如下:
create table t1( id int not null default 0, name varchar(10), primary key(id) )engine=InnoDB;
查看下:
select * from t1;
这样有产生了死锁:
mysql有解锁机制,这里可以看到产生了Deadlock。然后将其释放了,这样session1就运行成功了!
使用
show engine innodb status \G
可以查看锁相关的信息;
在latest detected deadlock。如看到update t1 est name = 'ddddd' where id = 2这个地方产生了死锁。
innodb_print_all_deadlocks开启后可以将死锁信息添加到error.log里面
show variables like '%dead%';
目前是OFF状态。
第二种情况产生死锁是在同一时刻。如下时序图:
这里如果session1成功将检索到数据和session2的数据一样,但是顺序不同,就会参数死锁。
如session1获得的数据:
session2检索的数据:
其实就变成了和第一种差不多的形式。
下面来说明下InnoDB中如何减少死锁:
1. 自动死锁检测,优先回滚小事务;
2. 超时设置(参数innodb_lock_wait_timeout);
3. 尽快提交事务,小事务不容易发生死锁;
4. 加for update,lock in share mode读锁时,最好降低事务隔离级别,例如使用RC(读已提交),降低死锁发生概率
5. 事务中涉及多个表,或多行时,每个事务操作顺序要保持一致,最好用存储过程/函数固化;
6. 通过索引等方式优化SQL效率,降低死锁发生概率(减少扫描/锁范围,降低概率;)
MySQL笔记-死锁原理与分析及InnoDB中如何减少死锁相关推荐
- DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2
本文介绍使用Windbg去验证<DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子>中的结论,调试对象是文中刚开始那个例子.(转载请指明出于breakso ...
- DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子
有了前面两节的基础,我们现在切入正题:研究下DllMain为什么会因为不当操作导致死锁的问题.首先我们看一段比较经典的"DllMain中死锁"代码.(转载请指明出于breaksof ...
- MySQL笔记-ibd文件格式初步分析(仅数据块笔记)
在MySQL建立表后,会在对应的库文件夹下创建2个文件. 一个是frm,一个是ibd,目前这个博文为简单分析下这个文件格式. 这里首先要知道一些预备知识: 查看InnoDB块的大小,一般是16k sh ...
- 【转】2.3【MySQL】运行原理(三)InnoDB 逻辑存储结构
MySQL的存储结构分为5级:表空间.段.簇.页.行. 1.表空间 TableSpace 上篇[MySQL]从InnoDB的内存结构.磁盘结构到update sql执行过程分析 在磁盘结构部分就说过了 ...
- mysql笔记(锁、事务、性能优化、压测结果)
Mysql 该笔记,主要根据kkb课程并结合网上资料和自己的理解而形成. 一.Mysql架构 1.1 逻辑架构 这是从网上copy过来的图.网上一些教程会把mysql也进行分层. 连接层:Connec ...
- DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)
之前几篇文章主要介绍和分析了为什么会在DllMain做出一些不当操作导致死锁的原因.本文将总结以前文章的结论,并介绍些DllMain中还有哪些操作会导致死锁等问题.(转载请指明出于breaksoftw ...
- DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系
前几篇文章一直没有在源码级证明:DllMain在收到DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH时会进入临界区.这个论证非常重要,因为它是使其他线程不能进入临界区从而导致 ...
- MySQL Innodb表导致死锁日志情况分析与归纳
案例描述 在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下: (1)insert into back ...
- mysql 表死锁_MySQL Innodb表导致死锁日志情况分析与归纳
案例描述在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下:(1)insert into backup ...
最新文章
- LINUX进程调度分析源码,Linux 实时调度(源码分析)
- python环境设置_CentOS 7.2环境搭建实录(第四章:python环境配置)
- 远场语音识别,性能提升 30%,百度怎么做到的?
- 怎么查看和修改 MySQL 的最大连接数?
- vb 发送html邮件,【VB】邮件发送功能
- 为什么我不建议你使用Java序列化
- iis php5.4配置_PHP5.4 + IIS + Win2008 R2 配置
- java 小球运动轨迹_java怎么实现小球的运动轨迹
- Django项目将debug模式设置为false时,静态文件出错
- Quartz配置信息
- MySQL转账储存过程_实用的银行转账存储过程和流水号生成存储过程
- 10 个用于网络管理员进行高级扫描的端口扫描工具
- 升级ios13后,iPhone手机新增了截长屏功能,实用又方便
- 【报告分享】2021潮购人群洞察报告-巨量算数(附下载)
- pat 训练题 7-5 基友团 (25分) 暴力判团和最大团
- java 实现橡皮擦_基于canvas剪辑区域功能实现橡皮擦效果
- php tipask yii 单点登录_Tipask问答系统 php版 v3.3.1 正式版
- 随便写的:新戏剧之王,一部广义上的烂片观后感
- 蓝桥杯刷题,第四界省赛B组
- 三款好用的语音转文字软件,你知道几个?
热门文章
- linux下搭建svn版本控制软件
- NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询
- Android的移动存储解决方案“.NET研究”之SharedPreferences
- B 站崩了,受害程序员聊聊
- 为什么 ++[[]][+[]]+[+[]] = 10 ?
- FreeEIM 来点新知识iOS UIScrollView详解
- 飞鸽传书技术更新换代非常快
- 在mount里看到哪个设备文件的一些笔记
- 飞鸽-http://www.freeeim.com/
- 苦逼了6年,我今天终于把老板开了!哼!