参考:MySQL 加锁处理分析。该文已经讲的很详尽了,也易懂,下面仅仅是个人做的总结。

一、 背景

1.1 隔离级别

1.2 加锁过程

逐条处理,逐条加锁。

mysql gap锁演示案例 mysql什么时候是gap锁_MySQL

1.3 两阶段锁2PL

1.4 gap锁

gap锁是间隙锁,即相邻两条有效记录间隙的锁(锁的是间隙),它是针对insert的,用来解决幻读的发生。它会阻塞insert,但不会阻塞delete/update等(记录本来也不存在)。

RC与RR的重要区别就是幻读。所以RR才需要引入gap锁。

二、加锁组合分析

说加什么锁,首先要了解两个前提:1)隔离级别;2)用到的索引。不同的隔离级别,不同的索引都会影响加锁。

2.1 可提交读RC

主键/唯一键

二级索引

无索引

select

insert

行锁

行锁

行锁

select...for update/update/delete

行锁

有效行的行锁

全表锁聚簇索引

2.2 可重复读RR

主键/唯一键

二级索引

无索引

select

insert

行锁

行锁

行锁

select...for update/update/delete

行锁

有效行的行锁+gap锁

全表锁聚簇索引

2.3 可序列化S

主键/唯一键

二级索引

无索引

select(快照读)

S

S

S

其他(当前读)

X

X

X

注意:无索引时,select...for update/update/delete是需要锁全表的,但mysql_server可以做优化,在逐条加锁时,如果发现不是目标记录,可以释放掉锁。但这会违背2PL的原则。

2.4 结论

死锁的发生与否,并不在于事务中有多少条SQL语句,死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。

加锁过程是逐条处理,逐条加锁(最终都反映在聚簇索引上)的。

主键,加在聚簇索引上;

二级索引,加在二级索引+聚簇索引上;

无索引,加在聚簇索引上。

所以如果两个session用到不同的二级索引,那么对聚簇索引的加锁顺序是不一致的,从而导致session间锁的持有与竞争,很容易产生死锁。

MySQL加锁分析 (转)

参考:MySQL 加锁处理分析.该文已经讲的很详尽了,也易懂,下面仅仅是个人做的总结. 一. 背景 1.1 隔离级别 1.2 加锁过程 逐条处理,逐条加锁. 1.3 两阶段锁2PL 1.4 gap锁 ...

mysql InnoDB加锁分析

文章转载自:http://www.fanyilun.me/2017/04/20/MySQL%E5%8A%A0%E9%94%81%E5%88%86%E6%9E%90/ 以下实验数据基于MySQL 5.7 ...

MySQL 加锁处理分析

1    背景    1 1.1    MVCC:Snapshot Read vs Current Read    2 1.2    Cluster Index:聚簇索引    3 1.3    2P ...

MySQL 加锁处理分析 转

MySQL 加锁处理分析  转 http://hedengcheng.com/?p=771 十二 13th, 2013 发表评论 | Trackback   1    背景    1 1.1    M ...

转载-MySQL 加锁处理分析

MySQL 加锁处理分析 发表于 2013 年 12 月 13 日 由 hedengcheng 1    背景    1 1.1    MVCC:Snapshot Read vs Current Re ...

MySQL 加锁处理分析-转载

来自何登成的技术博客     1.1    MVCC:Snapshot Read vs Current Read    2 1.2    Cluster Index:聚簇索引    3 1.3     ...

MySQL 加锁处理分析<转>

1    背景    1 1.1    MVCC:Snapshot Read vs Current Read    2 1.2    Cluster Index:聚簇索引    3 1.3    2P ...

MySQL的并发控制与加锁分析

本文主要是针对MySQL/InnoDB的并发控制和加锁技术做一个比较深入的剖析,并且对其中涉及到的重要的概念,如多版本并发控制(MVCC),脏读(dirty read),幻读(phantom read ...

MySQL加锁处理分析(转)

add by zhj: 非常棒的一篇文章,是我见过的讲加锁最棒最详细的文章了.之前听过网易的,里面的课程讲的也很好,但锁这块讲的跟 这篇文章相比,还是有差距的.网易&l ...

随机推荐

写出好的 commit message

为何要关注提交信息 加快Reviewing Code的过程 帮助我们写好release note 5年后帮你快速想起来某个分支,tag或者 commit增加了什么功能,改变了哪些代码 让其他的开发者在 ...

2D地图随机生成

2D地图随机生成基础绘图 海陆分布

前端学习_01_css网页布局

引子 之前也自己陆陆续续地学了一些web方面的知识,包括前段和后端都有涉及到,自己也比较感兴趣,感谢peter老师,愿意无偿提供从零开始的教学,之前也看过peter老师的一些视频,节奏非常适合我,决心 ...

java中new关键字和newInstance()方法的区别

1> new是一个关键字,可以说是一个指令: newInstance()是一个方法,Class对象的一个方法. 2> new主要作用是在内存中生成一个实例,而这个类可以没有提前加载到内从中 ...

PHP----------linux下安装opcache.

1.首先查看是否安装了opcache扩展,使用php -m 命令查看安装的扩展(没有添加环境变量就使用:/usr/local/php/bin/php -m). 添加opcache扩展.(我自己封装的s ...

PHP中友好的处理方式

在使用PHP进行开发的时候,由于PHP是弱类型语言的特性,所以,偶尔会遇到一些意想不到的错误.规范我们的编程就变得尤为重要了.下面总结一下,我日常开发中的一些经验,可能有些地方不妥,还请多多斧正,指教 ...

006-Python函数

Python函数(def) 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数.函数能 ...

NPOI解决由于excel删除数据导致空行读取问题

1.解决问题思路一:申明判断是否空行变量用于判断是否空行,声明变量数组用于临时非空行数据,最后存于datatable中. /// 读取excel, /// 默认第一行为表 ...