前言

任何系统不管在什么阶段都需要关注生产环境错误日志,最近几个月内,发现偶尔会出现数据库死锁情况。以前碰到的数据库类错误大部分是SQL语法造成的错误,来到新东家之后才第一次碰到死锁情况,以前是搞游戏开发,现在是搞电商类开发,可能是不同的项目不同的业务的原因吧,查阅了各种资料后发现,是我想错了:(。一般业务瓶颈在数据库层,对于数据库层的问题需要重点关注,以为死锁这种情况是很严重的问题,这个要分情况,偶尔死锁对业务不会有太大的影响,我又想错了:(。

虫子发现
  第一次发现死锁很惊讶,这个是什么鬼?不知道是什么原因?不知道怎么解决?不知道会不会影响业务?没有搞清楚这个问题,生怕是业务的定时炸弹,每天心里不踏实。虫子发现如下:

死锁
  对数据库记录操作之前,当前线程需要先请求获得相关锁,获得锁之后才会执行SQL语句。锁根据粒度分为表锁和行锁(不是所有存储引擎都支持行锁),锁根据类型分为排他锁和共享锁(不同的操作需要获得的锁类型不同,不同的锁类型行为也不相同)。资源越少,出现死锁的概率会更小,比如只支持表锁的存储引擎会比支持行锁的存储引擎出现的概率更小。
  并发事务出现时,当出现多个事务间彼此等待对方资源释放,事务因没有处理完,已经获得锁的资源不会释放,大家彼此这样等待着僵持着,这样会一直下去,死锁就这样产生了。
  死锁现象关系型数据库无法避免,不是MySQL 数据库独有。MySQL 数据库会自动检查死锁情况,当发现时,会回滚更简单的事务并返回给线程一个错误。怎么判断哪个事务更简单呢,根据事务影响的纪录行数判断,纪录行数越小被认为更简单。

诊断分析
  当出现死锁时,为了解决这个问题,需要诊断分析当时出现死锁的上下文信息以及相关的执行语句,这样才能知道怎么避免。MySQL 数据库只保存最近一次的死锁事务,如果同时有超过2个事务出现死锁,至多只保存2个事务信息。执行MySQL 客户端命令:SHOW ENGINE INNODB STATUS获得最近一次事务死锁相关信息。如果是MySQL 5.6之后的版本,可以打开全局变量innodb_print_all_deadlocks=ON,这样死锁相关信息会保存到MySQL 错误日志中。如果是不支持这个变量的版本,可以采用定时执行客户端命令采集死锁信息,然后保存到日志文件中,每个事务都有唯一编号,可以根据这个去重。当死锁频繁出现时,需要引起注意;当偶尔出现时,可以不用关注。死锁信息格式如下,不同MySQL 版本内容会有点差异,相关说明可以查看参考资料一。

预防措施
  知道死锁为何物,以及通过分析诊断日志信息,就可以对症下药了,但是有一些通用的基本原则可以遵守:
  1 尽可能保持事务简单以及快速执行;
  2 尽可能保持事务影响行数少以及涉及的相关表少;
  3 避免使用外键约束,其实大部分应用允许数据冗余的;
  4 影响行数大的事务尽量使用相同的排序过滤;
  5 数据库并发不高的业务,可以通过某种方式顺序执行语句,一次只执行一个,通过查资料知道一种实现方式:创建一个表,这个表始终只有一条纪录,各个事务通过争夺这个锁来实现线性执行,感觉这个应该没啥用:(;
  6 有些场景死锁会检查不到,设置锁的过期时间就很重要了,MySQL可以通过设置选项innodb_lock_wait_timeout;

危害程度
  锁资源得不到及时释放,会影响数据库并发处理,如果经常出现死锁,需要及时采取措施处理,如果只是偶尔出现,业务逻辑捕捉到死锁错误可以采取重试执行事务,对业务不会有什么影响,总之具体问题需要具体分析:)

后记
  一开始遇到这个问题有点紧张,以为是很严重的问题,无从下手,不了解相关的背景知识嘛,看来人丑还是要多读书啊(:(:

参考资料
【1】How to deal with MySQL deadlocks
https://www.percona.com/blog/2014/10/28/how-to-deal-with-mysql-deadlocks/
【2】deadlock
http://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_deadlock
【3】Deadlock Detection and Rollback
http://dev.mysql.com/doc/refman/5.7/en/innodb-deadlock-detection.html
【4】 How to Cope with Deadlocks
http://dev.mysql.com/doc/refman/5.7/en/innodb-deadlocks.html

一次MySQL(INNODB存储引擎) 死锁捉虫记的更多相关文章

  1. mysql - InnoDB存储引擎 死锁问题( Deadlock found when trying to get lock; try restarting transaction )

    刚刚向数据库插入数据的时候出现了这么一段错误 Deadlock found when trying to get lock; try restarting transaction 主要原因(由于无法使 ...

  2. 浅析Mysql InnoDB存储引擎事务原理

    浅析Mysql InnoDB存储引擎事务原理 大神:http://blog.csdn.net/tangkund3218/article/details/47904021

  3. MySQL InnoDB存储引擎体系架构 —— 索引高级

    转载地址:https://mp.weixin.qq.com/s/HNnzAgUtBoDhhJpsA0fjKQ 世界上只两件东西能震撼人们的心灵:一件是我们心中崇高的道德标准:另一件是我们头顶上灿烂的星 ...

  4. MySQL InnoDB存储引擎

    200 ? "200px" : this.width)!important;} --> 介绍 本篇文章是对Innodb存储引擎的概念进行一个整体的概括,innodb存储引擎的 ...

  5. MySQL InnoDB存储引擎中的锁机制

    1.隔离级别 Read Uncommited(RU):这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用. Read Committed (RC):仅能读取到已提交 ...

  6. mysql innodb存储引擎介绍

    innodb存储引擎1.存储:数据目录.有配置参数为“ innodb_data_home_dir ” .“ innodb_data_file_path ” 和 “innodb_log_group_ho ...

  7. MySQL InnoDB存储引擎undo redo解析

    本文介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo Log Undo Log 为了实现事务原子,在MySQL数据库InnoDB存储引擎,还使用Undo Log(简称:MVCC ...

  8. MySQL InnoDB 存储引擎探秘

    在MySQL中InnoDB属于存储引擎层,并以插件的形式集成在数据库中.从MySQL5.5.8开始,InnoDB成为其默认的存储引擎.InnoDB存储引擎支持事务.其设计目标主要是面向OLTP的应用, ...

  9. 设置mysql InnoDB存储引擎下取消自动提交事务

    mysql 存储引擎中最长用的有两种,MyISAM 存储引擎和InnoDB存储引擎. 1.MyISAM 存储引擎 不支持事务,不支持外键,优势是访问速度快: 2.InnoDB存储引擎 支持事务,一般项 ...

  10. mysql innodb存储引擎和一些参数优化

    mysql 的innodb存储引擎是事务性引擎,支持acid.innodb支持版本控制和高并发的技术是svcc:需要重点注意:myisam只缓存索引,innodb缓存索引和数据:

随机推荐

  1. P3379最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

  2. 使用内存流导出Excel

    public MemoryStream MemoryStreamDeiveFlowInfoaging(DataTable Table) { Dictionary<int , string> ...

  3. [Swift通天遁地]四、网络和线程-(4)使用Alamofire实现网络请求

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. display:none 和 hidden 区别

  5. hdu2029

    http://acm.hdu.edu.cn/showproblem.php?pid=2029 #include<stdio.h> #include<string.h> #inc ...

  6. 【转】linux下passwd命令设置修改用户密码

    1.passwd 简单说明: 我们已经学会如何添加用户了,所以我们还要学习设置或修改用户的密码:passwd命令的用法也很多,我们只选如下的几个参数加以说明:想了解更多,请参考man passwd或p ...

  7. Java常用类库(一) : Object 和日期类的简单使用

    顶哥说:Java是世界的,但项目不是! Java有非常多的类库,而我们不会也不用都去学习,毕竟你也仅仅掌握了你手机20%的功能却足够你使用,不是吗? 今天介绍以下类: l  Object l  Dat ...

  8. jQuery导航插件One-Page-Nav演示-显示命名锚记

    jQuery导航插件One-Page-Nav演示-显示命名锚记 简介 使用 选项 示例 推荐 简介 电商网站的分类比较明确,比如1楼是手机通讯产品,2楼是家用电器,3楼是服装鞋包等等,旁边还会有一个固 ...

  9. 零基础到精通Linux,从这篇文章开始

    2018年想做Linux运维的人应该如何学习才能快速精通Linux? Linux入门这么简单,为什么很多人学不会? 想要成为一个合格的运维工程师,到底怎么才能从零开始精通Linux? 作为一个运维小白 ...

  10. 基于fpga uart学习笔记

    2018年7月24日 uart 接收 部分测试成功,多谢开源骚客 邓堪文老师 ,想学的同学可以微信公众号搜索开源骚客 好啦!言归正传. 1.先附上老师的时序图,自己有点懒不想画,rx_t.rx_tt. ...