mysql 执行存储过程卡死_mysql 存储过程出现死锁_鬼冢喜之郎的博客-程序员宅基地

技术标签: mysql 执行存储过程卡死  

1. session1 执行 delete  会在唯一索引 c2 的 c2 = 15 这一记录上加 X lock(也就是在MySQL 内部观测到的:X Lock but not gap);

2. session2 和 session3 在执行 insert 的时候,由于唯一约束检测发生唯一冲突,会加 S Next-Key Lock,即对 (1,15] 这个区间加锁包括间隙,并且被 seesion1 的 X Lock 阻塞,进入等待;

3. session1 在执行 commit 后,会释放 X Lock,session2 和 session3 都获得 S Next-Key Lock;

4. session2 和 session3 继续执行插入操作,这个时候 INSERT INTENTION LOCK(插入意向锁)出现了,并且由于插入意向锁会被 gap 锁阻塞,所以 session2 和 session3 互相等待,造成死锁。

死锁日志如下:

INSERT INTENTION LOCK

在之前的死锁分析第四点,如果不分析插入意向锁,也是会造成死锁的,因为插入最终还是要对记录加 X Lock 的,session2 和 session3 还是会互相阻塞互相等待。

但是插入意向锁是客观存在的,我们可以在官方手册中查到,不可忽略:

Prior to inserting the row, a type of gap lock called an insert intention gap lock is set. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap.

插入意向锁其实是一种特殊的 gap lock,但是它不会阻塞其他锁。假设存在值为 4 和 7 的索引记录,尝试插入值 5 和 6 的两个事务在获取插入行上的排它锁之前使用插入意向锁锁定间隙,即在(4,7)上加 gap lock,但是这两个事务不会互相冲突等待。

当插入一条记录时,会去检查当前插入位置的下一条记录上是否存在锁对象,如果下一条记录上存在锁对象,就需要判断该锁对象是否锁住了 gap。如果 gap 被锁住了,则插入意向锁与之冲突,进入等待状态(插入意向锁之间并不互斥)。总结一下这把锁的属性:

1. 它不会阻塞其他任何锁;

2. 它本身仅会被 gap lock 阻塞。

在学习 MySQL 过程中,一般只有在它被阻塞的时候才能观察到,所以这也是它常常被忽略的原因吧...

GAP LOCK

在此例中,另外一个重要的点就是 gap lock,通常情况下我们说到 gap lock 都只会联想到 REPEATABLE-READ 隔离级别利用其解决幻读。但实际上在 READ-COMMITTED 隔离级别,也会存在 gap lock ,只发生在:唯一约束检查到有唯一冲突的时候,会加 S Next-key Lock,即对记录以及与和上一条记录之间的间隙加共享锁。

通过下面这个例子就能验证:

这里 session1 插入数据遇到唯一冲突,虽然报错,但是对 (15,20] 加的 S Next-Key Lock 并不会马上释放,所以 session2 被阻塞。另外一种情况就是本文开始的例子,当 session2 插入遇到唯一冲突但是因为被 X Lock 阻塞,并不会立刻报错 “Duplicate key”,但是依然要等待获取 S Next-Key Lock 。

有个困惑很久的疑问:出现唯一冲突需要加 S Next-Key Lock 是事实,但是加锁的意义是什么?还是说是通过 S Next-Key Lock 来实现的唯一约束检查,但是这样意味着在插入没有遇到唯一冲突的时候,这个锁会立刻释放,这不符合二阶段锁原则。这点希望能与大家一起讨论得到好的解释。

如果是在 REPEATABLE-READ,除以上所说的唯一约束冲突外,gap lock 的存在是这样的:

普通索引(非唯一索引)的S/X Lock,都带 gap 属性,会锁住记录以及前1条记录到后1条记录的左闭右开区间,比如有[4,6,8]记录,delete 6,则会锁住[4,8)整个区间。

对于 gap lock,相信 DBA 们的心情是一样一样的,所以我的建议是:

1. 在绝大部分的业务场景下,都可以把 MySQL 的隔离界别设置为 READ-COMMITTED;

2. 在业务方便控制字段值唯一的情况下,尽量减少表中唯一索引的数量。

锁冲突矩阵

前面我们说的 GAP LOCK 其实是锁的属性,另外我们知道 InnoDB 常规锁模式有:S 和 X,即共享锁和排他锁。锁模式和锁属性是可以随意组合的,组合之后的冲突矩阵如下,这对我们分析死锁很有帮助。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36051235/article/details/113283627

智能推荐

python: jquery实现全选 反选 取消_weixin_30635053的博客-程序员宅基地

引入这个jquery-1.12.4.jsjquery实现全选 反选 取消<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head> <ti...

算法——A*寻路_井冈山市监人的博客-程序员宅基地

首先说明下,不知道为什么代码都重复了一遍,编辑的时候是不重复的,发布之后就这样了。http://www.policyalmanac.org/games/aStarTutorial.htm 这是英文原文《A*入门》,最经典的讲解,有demo演示http://www.cnblogs.com/technology/archive/2011/05/26/2058842.html 这是国人翻译...

Retain Cycles and Weak References_chuanyituoku的博客-程序员宅基地

ARC’s behavior is automatic and mindless; it knows nothing of the logic of the relationships between objects in your app. Sometimes, you have to provide ARC with further instructions to prevent it fro

Sublime编辑器的简单操作(快捷键+切换模式)_Bravo!!!的博客-程序员宅基地_sublime字符集切换

Sublime 网站开发编辑器1. 添加快捷键打开方式:开始-运行-regedit(打开系统注册表)-shell(Ctrl+F 搜索shell)-新建Sublime(右键)-新建command-“默认”写“路径”-p --remote-tab-silent "%1".2. sublime 开启vi功能:Ctrl+X 剪切 “Vintage” 粘贴至【首选项】——【浏览程序包】——【首选项】——【设置—默认】——(文件下拉至last time)"ignore_packages":[……](删除其..

RichEdit 小结_weixin_30609287的博客-程序员宅基地

一般性问题1. 代码编译通过了,运行后RichEdit控件不显示,在InitInstance中添加BOOL CWinApp::InitInstance (){…AfxInitRichEdit(); - RichEdit 1.0或 AfxInitRichEdit2(); - RichEdit 2.0…}2. 升级默认的RichEdit版本,默认的版本有BUG,在InitInstance...

随便推点

二维码生成扫瞄_欧洲虾米的博客-程序员宅基地

二维码加库:coremedia corevido ,quartcore. avf. libiconPrivacy - Camera Usage Description#import “ViewController.h”#import “libqrencode/QRCodeGenerator.h”#import “ZBarSDK/Headers/ZBarSDK/ZBarSDK.h”@...

fastJSON源码分析_11_IOUtils工具类浅析(1)_A1ex_t的博客-程序员宅基地_io.fastjson

[email protected]文章简介本篇文章我们分析有关fastJSON的输出工具类IOUtils.该类帮助fastJSON更加快速地进行输入输出.源码分析我们先看该类的静态代码块,这里出现了两个循环 static { for (char c = 0; c < firstIdentifierFlags.length; ++c) { if (c >= 'A' && c <= 'Z') { .

sql日期转换_漫步花津的博客-程序员宅基地

Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06 Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16 Select CONVERT(varchar(100),

Struts2概述及与Struts1的对比_水田如雅的博客-程序员宅基地

Struts2 概述1,仍然是一个基于请求响应的MVC框架2,Struts2不是Struts1的升级3,Struts2与Struts1的体系结构差距非常大4,Struts2采用了另一个MVC框架WebWork的核心设计5,Struts2更优秀:松耦合设计。。  Struts1与Struts2的对比1,Action方面Struts1的Action必须继承;Struts1是单例的,存在线程安全问题;控

文件上传下载_小发明家啦啦啦啦啦的博客-程序员宅基地

上传<style type="text/css"> /*文件上传 控件*/ .upload{position:relative; display:inline-block; height:33px;line-height:33px; overflow:hidden;vertical-align:middle; cursor:pointer;} .uploa...

为什么要用计算机实现数字控制,第四章计算机数字控制系统答案.ppt_阿弥陀佛 我是小胖的博客-程序员宅基地

第四章 计算机数字控制系统;提要;目标;建议;;2. 数控系统的硬件结构;CNC装置是按模块化设计的方法构造.模块化设计方法:将控制系统按功能划分成若干种具有独立功能的单元模块,并配上相应的驱动软件。系统设计时按功能的要求选择不同的功能模块,并将其插入控制单元母板上,即可组成一个完整的控制系统的方法。实现CNC系统模块化设计的条件是总线(BUS)标准化。采用模块化结构时,CNC系统设计工作则...

推荐文章

热门文章

相关标签