根据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中如何减少死锁相关推荐

  1. DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子2

    本文介绍使用Windbg去验证<DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子>中的结论,调试对象是文中刚开始那个例子.(转载请指明出于breakso ...

  2. DllMain中不当操作导致死锁问题的分析--导致DllMain中死锁的关键隐藏因子

    有了前面两节的基础,我们现在切入正题:研究下DllMain为什么会因为不当操作导致死锁的问题.首先我们看一段比较经典的"DllMain中死锁"代码.(转载请指明出于breaksof ...

  3. MySQL笔记-ibd文件格式初步分析(仅数据块笔记)

    在MySQL建立表后,会在对应的库文件夹下创建2个文件. 一个是frm,一个是ibd,目前这个博文为简单分析下这个文件格式. 这里首先要知道一些预备知识: 查看InnoDB块的大小,一般是16k sh ...

  4. 【转】2.3【MySQL】运行原理(三)InnoDB 逻辑存储结构

    MySQL的存储结构分为5级:表空间.段.簇.页.行. 1.表空间 TableSpace 上篇[MySQL]从InnoDB的内存结构.磁盘结构到update sql执行过程分析 在磁盘结构部分就说过了 ...

  5. mysql笔记(锁、事务、性能优化、压测结果)

    Mysql 该笔记,主要根据kkb课程并结合网上资料和自己的理解而形成. 一.Mysql架构 1.1 逻辑架构 这是从网上copy过来的图.网上一些教程会把mysql也进行分层. 连接层:Connec ...

  6. DllMain中不当操作导致死锁问题的分析——DllMain中要谨慎写代码(完结篇)

    之前几篇文章主要介绍和分析了为什么会在DllMain做出一些不当操作导致死锁的原因.本文将总结以前文章的结论,并介绍些DllMain中还有哪些操作会导致死锁等问题.(转载请指明出于breaksoftw ...

  7. DllMain中不当操作导致死锁问题的分析--加载卸载DLL与DllMain死锁的关系

    前几篇文章一直没有在源码级证明:DllMain在收到DLL_PROCESS_ATTACH和DLL_PROCESS_DETACH时会进入临界区.这个论证非常重要,因为它是使其他线程不能进入临界区从而导致 ...

  8. MySQL Innodb表导致死锁日志情况分析与归纳

    案例描述 在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下: (1)insert into back ...

  9. mysql 表死锁_MySQL Innodb表导致死锁日志情况分析与归纳

    案例描述在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志. 两个sql语句如下:(1)insert into backup ...

最新文章

  1. LINUX进程调度分析源码,Linux 实时调度(源码分析)
  2. python环境设置_CentOS 7.2环境搭建实录(第四章:python环境配置)
  3. 远场语音识别,性能提升 30%,百度怎么做到的?
  4. 怎么查看和修改 MySQL 的最大连接数?
  5. vb 发送html邮件,【VB】邮件发送功能
  6. 为什么我不建议你使用Java序列化
  7. iis php5.4配置_PHP5.4 + IIS + Win2008 R2 配置
  8. java 小球运动轨迹_java怎么实现小球的运动轨迹
  9. Django项目将debug模式设置为false时,静态文件出错
  10. Quartz配置信息
  11. MySQL转账储存过程_实用的银行转账存储过程和流水号生成存储过程
  12. 10 个用于网络管理员进行高级扫描的端口扫描工具
  13. 升级ios13后,iPhone手机新增了截长屏功能,实用又方便
  14. 【报告分享】2021潮购人群洞察报告-巨量算数(附下载)
  15. pat 训练题 7-5 基友团 (25分) 暴力判团和最大团
  16. java 实现橡皮擦_基于canvas剪辑区域功能实现橡皮擦效果
  17. php tipask yii 单点登录_Tipask问答系统 php版 v3.3.1 正式版
  18. 随便写的:新戏剧之王,一部广义上的烂片观后感
  19. 蓝桥杯刷题,第四界省赛B组
  20. 三款好用的语音转文字软件,你知道几个?

热门文章

  1. linux下搭建svn版本控制软件
  2. NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询
  3. Android的移动存储解决方案“.NET研究”之SharedPreferences
  4. B 站崩了,受害程序员聊聊
  5. 为什么 ++[[]][+[]]+[+[]] = 10 ?
  6. FreeEIM 来点新知识iOS UIScrollView详解
  7. 飞鸽传书技术更新换代非常快
  8. 在mount里看到哪个设备文件的一些笔记
  9. 飞鸽-http://www.freeeim.com/
  10. 苦逼了6年,我今天终于把老板开了!哼!