innodb存储引擎 - 锁

MySQL技术内幕:Innodb存储引擎

(间隙锁目前理解的还不是很透彻,后面索引看完了再过来回顾一下间隙锁)

第六章 锁

一、Innodb存储引擎中的锁

1.锁是数据库区别于文件系统的一个关键特性,

2.两种标准的行级锁:

  • 共享锁(S Lock):允许事务读一行数据
  • 排它锁(X Lock):允许事务删除或更新一行数据

​ S锁与S锁兼容,与X锁不兼容:也就是如果事务t1获取了行r的共享锁,那么事务t2也想获取行r的共享锁是可以获取到的(这种情况成为锁兼容),但是如果事务t3想获取行r的排它锁是不能获取到的,必须释放t1、t2释放行r上的共享锁(这种情况成为锁不兼容)。

​ X锁与任何锁都不兼容。

​ S锁与X锁都是行锁,兼容指的是对于同一行(row)数据来说。

​ 表:排它锁与共享锁的兼容性

XS
X不兼容不兼容
S不兼容兼容

Innodb支持多粒度锁定,这种锁定允许事务在行级锁和表级锁同时存在,为了支持在不同粒度上进行加锁操作,Innodb支持一种额外的锁方式,叫做意向锁。

3.意向锁:

意向锁的含义,在innodb中如果对表加了意向锁,说明表中的行在加锁的状态,对任意行加锁前必须先对他的表加上意向锁,

意向锁分为:

  • 意向共享锁:事务想获得一张表中某几行的共享锁
  • 意向排它锁:事务想获得一张表中某几行的排它锁

由于innodb存储引擎支持的行级锁,因此意向锁其实不会阻塞除全表扫描以外的任何请求。故表级意向锁与表级锁的兼容性如表

ISIXSX
IS兼容兼容兼容不兼容
IX兼容兼容不兼容不兼容
S兼容不兼容兼容不兼容
X不兼容不兼容不兼容不兼容

PS:上述表格中的IS、IX、S、X都表示的是表级锁,S、X并不是书上 所说的表级锁。

4.一致性非锁定读(和隔离级别有关)

如果读取的行正在执行delete或者update操作,这时读取操作不会因此去等待行上锁的释放,相反,Innodb会去读取行的一个快照数据。之所以成为非锁定读,是因为不需要等待行上的X锁释放。

快照数据:是指改行之前的版本的数据,该实现是通过undo段来完成的,而undo用来在事务回滚数据。因此快照本身并没有额外的开销。

因此一致性非锁定读提高了并发性,Innodb存储引擎是默认的读取方式,即读取不会占用和等待表上的锁,但是在不同的隔离级别下,读取的方式是不同的,并不是每个事物的隔离级别都采用一致性非锁定读的,并且即使采用一致性非锁定度读取的快照副本也是不一样的。

在事务的隔离级别Read Committed(读已提交)和Repeatable Read(可重复度)下,Innodb采用一致性非锁定读;Read Committed 下是读取被锁定行的最新一份的快照数据,而Repeatable Read下是读取事务开始时的行数据版本。

例子:Read Committed下:事务1开启查询id=1,事务二开启将id=1的值改变为了id=2;事务1再一次读id=1,获取的结果为Empty,因为读已提交是读取最新一份的快照数据。

Repeatable Read下:事务1开启查询id=1,事务二开启将id=1的值改变为了id=2;事务1再一次读id=1,获取的结果是id=1,因为可重复度是会读取事务开启时的快照副本的数据。

ps:查看当前的隔离级别:select @@tx_isolation;

​ 更改事务的隔离级别:set [ global | session ] transaction isolation level Read uncommitted | Read committed | Repeatable | Serializable; (global | session :全局(已存在的不受影响)|当前窗口)

5.一致性锁定读

在某些情况下,用户需要显式地对数据库读取操作进行加锁来保证数据逻辑的一致性,这就要求数据库支持对读操作的加锁语句,即便是只读。Innodb存储引擎对于select语句支持两种一致性锁定读操作:

  • Select … For Update
  • Select … Lock In Share Mode

Select … for update 对读取的行记录加一个X锁,其他事物不能对已锁定的行加任何锁。

Select … Lock In Share Mode 对读取的行记录加一个S锁,其他事物可以向被锁定的行加S锁,但如果加X锁,则会被阻塞;

对于一致性非锁定读即使读取的行已经加了select … for update也是可以读取的,因为他读取的快照数据。

另外一致性锁定读Select … For Update、Select … Lock In Share Mode必须在事务中使用才有用,当事务提交了,锁也就被释放了。

6.外键和锁

外键主要用于完整的约束性检查,在Innodb中对于一个外键列,如果没有显式地创建这个列的索引,Innodb存储引擎就会对其加一个索引,因为这样可以避免表锁。

对于外键值的插入或更新,首先需要查询父表中的记录,即select父表。但是对于父表Select操作,不是使用的一致性非锁定读的方式,因为这样会导致数据的不一致的问题,因此这时使用的是Select … Lock In Share Mode 方式,即主动对父表加S锁,如果这时父表已经被上了X锁,子表的操作会被阻塞。

例子:假设父表id与子表pid关联,事务1删除父表中id=1的行不提交会对id=1的行加X锁,事务2要向子表中插入数据pid=1的数据,首先要Select父表id=1就会对id=1的行加S锁,X锁是排它锁所以Select操作被阻塞,所以子表插入被阻塞。

锁的算法

行锁的三种算法

  • Record Lock:单个行记录上的锁
  • Gap Lock:间隙锁,锁定一个范围,但不包含记录本身
  • Next-Key Lock:Gap Lock+Record Lock,锁定一个范围并包含记录本身

Record Lock:总是会去锁住索引记录,如果Innodb存储引擎表在建立的时候没有设置任何一个索引,那么这时Innodb存储引擎会使用隐式地主键来进行锁定。

Next-Key Lock:是结合了Gap Lock 和 Record Lock的一种锁定算法,在Next-Key Lock算法下,Innodb对于行的查询都采用这种锁定算法,例如一个索引有10,11,13,和20四个值,那么该索引可能被Next-Key Locking的区间为

(负无穷 - 10 ]

(10 - 11]

(11 - 13]

(13 - 20]

(20 - 正无穷)

除了Next-key Locking 还有previous-key locking,使用previous-key locking锁住的区间为

(负无穷 - 10 )

[10 - 11)

[11 - 13)

[13 - 20)

[20 - 正无穷)

当查询的索引含有唯一属性时,Innodb存储引擎会对Next-Key locking进行优化,将其降级为Record Lock,即仅锁住索引本身,而不是范围。

锁引发的问题:

脏读:事务读取到了其他事物未提交的数据,违反了事务的隔离性。

不可重复读:事务多次读取到的数据不一样,事务1第二次读取的数据是其他事物DML操作后提交的数据,造成了同一个语句两次读取的数据不一致。(与脏读的区别是不可重复读读取的数据是事务提交后的,脏读读取的是事务未提交的数据)

幻读:在可重复度的隔离级别下:事务使用当前读(for update,直接读读取的是开启时的undo快照数据)后一次查询查到了前一次没有查到的行,造成了幻读现象,使用间隙锁解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】深入浅出OOP(六): 理解C#的Enums

MSDN定义:枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。 例如,假设您必须定义一个变量,该变量的值表示一周中的一天。 该变量只能存储七个有意义的值。 若要定义这些值&#xff…

usb接口供电不足_AMD RX 6000 系列显卡配备USB-C 接口,支持外接供电

IT之家 10 月 29 日消息 根据 AMD 的官方信息,新发布的 RX 6000 系列显卡进一步增强了显示能力,配备了 HDMI 2.1 接口、DP 1.4 接口和 USB-C 接口。AMD 表示,AMD Radeon 6000 系列显卡全部搭载 HDMI 2.1 VRR 接口,超大带宽支持最高…

【转】VS2005键盘布局_快捷键大全(总结了一些记忆的口诀)

VS快捷键对提高生产力有莫大帮助,本文将所有快捷键进行了重新整理归类,便于记忆。有缺失,不足之处,还请大家指出,谢谢 1、窗口快捷键 (W代表Windows也就是窗口的意思) CtrlW,A: 命令窗口&#…

int与byte转换(四字节)

public byte[] intToByte(int res) {byte[] targets new byte[4];targets[0] (byte) (res & 0xff);// 最低位targets[1] (byte) ((res >> 8) & 0xff);// 次低位targets[2] (byte) ((res >> 16) & 0xff);// 次高位targets[3] (byte) (res >>…

mac securecrt程序无响应_如何重置mac上的系统管理控制器smc教程

虽然mac是一款十分高端的个人笔记本电脑,但是mac也会有出现故障的时候,比如风扇高速转动、键盘背光灯行为有些异常异常等等,那极有可能是你的系统管理控制器smc出现了问题,所以今天小编就来科普大家如何重置系统管理控制器smc。如…

bootstraptable treeGrid 懒加载_Java类加载机制及自定义加载器

一:ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中。jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式加载和显示加载。隐式加载:程序代码中不通过调用Clas…

【转】WCF、WebAPI、WCFREST、WebService之间的区别

在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API。在.net平台下,你有很多的选择来构建一个HTTP Services。我分享一下我对Web Service、WCF以及Web API的看法。 Web Service 1、它…

Idea打可执行jar包

前些日子试了下idea打包,有些细节没太注意所以经常打包失败,要不然就是显示没有主清单属性,所以一直用eclipse打包,今天又重新捣鼓了一下,写下过程: 1. 先添加需要打jar包的主入口 第三步一定不要放在main…

正则表达式:获取一串字符串中,某个字符串到某个字符串之间的字符串,不包含左右,只取中间

表示取出"EventType":" 到 "之间的字符串&#xff0c;非贪婪匹配 (?<"EventType":").*?(?")如果后面"也换成字符串的话&#xff0c;就把?换成?<即可 例子如下&#xff1a; public String getPattern(String str,Str…

安卓系统挂载NTFS格式硬盘_Mac 读写 NTFS硬盘管理开源工具NTFSTool

NTFSTool是Mac OS 下一款开源的 NTFS 磁盘格式读写工具&#xff0c;基于Electron和VUE编写。遵守MIT开源协议。支持 NTFS 磁盘读写、挂载&#xff0c;退出、管理等功能。系统检测到插入移动硬盘后&#xff0c;会自动弹出 NTFSTool 界面&#xff0c;并自动挂载硬盘。安装NTFSToo…

【转】刨根究底字符编码之九——字符编码方案的演变与字节序

字符编码方案的演变与字节序 一、字符编码方案的演变 1. 根据前面的介绍&#xff0c;对于字符编码方案的演变&#xff0c;我们大致上可简单地划分为三个阶段&#xff1a; ① ASCII编码方案阶段 → ② ANSI编码方案阶段 → ③ Unicode/UCS编码方案阶段。 在第一个阶段的ASCII…

python人工智能_人工智能人才缺口千万!学Python抓住风口机会

前不久教育界的一个消息&#xff0c;引发了广泛的关注。今年9月&#xff0c;浙江三到九年级信息技术课将替换新教材&#xff0c;八年级将新增Python课程内容。新高一信息技术编程语言由VB替换为Python&#xff0c;大数据、人工智能、程序设计与算法按照教材规划五六年级开始接触…

【转】刨根究底字符编码之十——Unicode字符集的字符编码方式

一、字符编码方式CEF的选择 1. 由于Unicode字符集非常大(并且作为开放字符集还在不断扩展之中)&#xff0c;有些字符的编号(即码点值)需要两个或两个以上字节来表示&#xff0c;而要对这样的编号进行编码&#xff0c;也必须使用两个或两个以上字节。 比如&#xff0c;汉字“…

ip和端口正则表达式

ip&#xff1a;来自站长工具 ^(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)$MAC地址&#xff1a; ^[A-F0-9]{2}(-[A-F0-9]{2}){5}$|^[A-F0-9]{2}…

【转】刨根究底字符编码之十一——UTF-8编码方式与字节序标记BOM

一、UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式&#xff1a;UTF-8、UTF-16、UTF-32。这里先介绍应用最为广泛的UTF-8。 为满足基于ASCII、面向字节的字符处理的需要&#xff0c;Unicode标准中定义了UTF-8编码方式。UTF-8应该是目前应用最广泛的一种Unic…

流水灯verilog实验原理_IC设计实例解析之“流水线技术”

源自&#xff1a;微信公众号 “数字芯片实验室”在IC设计中&#xff0c;如果寄存器之间的组合逻辑延时过大&#xff0c;可能会称为设计中的关键路径&#xff0c;从而降低整个电路的工作频率。如下图所示&#xff0c;是一个输入和输出寄存的算术计算逻辑。在set_input_delay和se…

【转】刨根究底字符编码之十二——UTF-8究竟是怎么编码的

UTF-8究竟是怎么编码的 1. UTF-8编码是Unicode字符集的一种字符编码方式(CEF)&#xff0c;其特点是使用变长字节数(即变长码元序列或称变宽码元序列)来编码。目前一般是1到4个字节&#xff0c;当然&#xff0c;也可以更长。 为什么要变长呢&#xff1f;这可以理解为按需分配…

记录今天写的几个正则,数字范围的校验

3到30的整数 ([3-9]|[1-2]\d|30)0到1460的整数 ^([0-9]|[1-9]\d{1,2}|1[0-3]\d{2}|14[0-5]\d{1}|1460)$0-99的整数 ([1-9]|[1-9]\d)//一个判断输入数字是整数的方法&#xff0c;不是整数会被删除掉&#xff0c;复制的内容也可以解决 //因为好几个地方用到了&#xff0c;所以…

iphone闪退修复工具_升级 iOS 14.2 微信闪退?iPhone 12 维修贵

原标题&#xff1a;升级 iOS 14.2 微信闪退&#xff1f;iPhone 12 维修贵昨天&#xff0c;苹果推出 iOS 14.2 正式版系统&#xff0c;我相信你们都知道了&#xff0c;主要新增几点功能&#xff0c;并没有针对性解决耗电问题&#xff0c;而对 AirPods Pro 充电进行优化&#xff…