广告
返回顶部
首页 > 资讯 > 数据库 >MySQL InnoDB 锁的相关总结
  • 466
分享到

MySQL InnoDB 锁的相关总结

MySQLInnoDBInnoDB锁 2022-05-16 11:05:58 466人浏览 安东尼
摘要

1.  Shared and Exclusive Locks shared lock (译:共享锁) exclusive lock (译:排它锁、独占锁) InnoDB实现了标准的行级锁,其中有两种类型的锁

1.  Shared and Exclusive Locks

shared lock (译:共享

exclusive lock (译:排它锁、独占锁)

InnoDB实现了标准的行级锁,其中有两种类型的锁,共享锁(shared locks)和排他锁(exclusive locks)。

A shared (S) lock permits the transaction that holds the lock to read a row.

An exclusive (X) lock permits the transaction that holds the lock to update or delete a row.

共享锁允许持有该锁的事务读取一行。

排它锁允许持有该锁的事务更新或删除行。

如果事务T1持有行 r 上的共享锁(S),那么来自不同事务T2的请求将按照以下方式处理: 

  • T2对S锁的请求可以立即被授予。结果就是,T1和T2在行r上都持有S锁。
  • T2对X锁的请求不能立即被授予。

如果事务T1持有行 r 上的排它锁(X),那么来自不同事务T2的请求不能立即被授予 r 上任何一种类型的锁。相反,事务T2必须等待事务T1释放其在行 r 上的锁。

2.  Intention Locks

Intention Locks(译:意向锁)

InnoDB支持多粒度锁,允许行锁和表锁共存。 例如,诸如LOCK TABLES ... WRITE之类的语句对指定表采用排它锁(X锁)。为了在多个粒度级别上实现锁,InnoDB使用了意向锁。意向锁是表级锁,它指示事务稍后需要对表中的一行使用哪种类型的锁(共享锁或者排它锁)。 

有两种类型的意向锁:

  • 意向共享锁(IS)表示事务打算在表中的单个行上设置共享锁。
  • 意向排他锁(IX)表示事务打算在表中的单个行上设置排它锁。

例如,SELECT ... LOCK IN SHARE MODE 设置一个IS锁,SELECT ... FOR UPDATE 设置一个IX锁。

意向锁的协定是这样的:

在事务获得表中某一行的共享锁之前,它必须首先获得表上的IS锁或更强锁。
在事务获得表中某一行的排它锁之前,它必须首先获得表上的IX锁。 
表级锁类型兼容性如下图:

如果一个锁与现有锁兼容,则将其授予请求的事务,但如果与现有锁冲突,则不授予该锁。事务等待,直到冲突的现有锁被释放。如果一个锁请求与一个现有的锁冲突,并且因为它会导致死锁而不能被授予,那么就会发生错误。

意向锁除了全表请求(例如LOCK TABLES ... WRITE)外,不阻止任何其他内容。意图锁定的主要目的是表明某人正在锁定表中的行或要锁定表中的行。

3.  Record Locks

Record Locks(译:记录锁)

A record lock is a lock on an index record. 

记录锁是索引记录上的锁。例如,SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE;  防止任何其他事务插入、更新或删除t.c1值为10的行。

记录锁总是锁定索引记录,即使一个表没有定义索引也是如此。如果表没有索引,InnoDB创建一个隐藏的聚集索引,并将该索引用于记录锁。

4.  Gap Locks

Gap Locks(译:间隙锁)

A gap lock is a lock on a gap between index records, or a lock on the gap before the first or after the last index record.  

间隙锁是在索引记录之间的间隙上的锁,或者是在第一个索引记录之前或最后一个索引记录之后的间隙上的锁。

例如,SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE;  防止其他事务将值15插入到t.c1列中,无论该列中是否已经有这样的值,因为范围内所有现有值之间的间隙都被锁定了。

间隙可能跨越单个索引值、多个索引值,甚至是空的。

间隙锁是性能和并发性之间权衡的一部分,在某些事务隔离级别中使用,而在其他级别中则不使用。

对于使用唯一索引锁定行以搜索唯一行的语句,不需要间隙锁定。

例如,如果id列有一个唯一的索引,下面的语句只对id值为100的行使用index-record锁,而不管其他会话是否在前面的间隙插入行:


SELECT * FROM child WHERE id = 100;

如果id列没有索引或者有一个非唯一索引,则该语句会锁定前面的间隙。

这里还值得注意的是,不同的事务可以在一个间隙上持有冲突的锁。

例如,事务A可以在一个间隙上持有一个共享间隙锁(gap S-lock),而事务B在同一个间隙上持有一个排他间隙锁(gap X-lock)。允许冲突间隙锁的原因是,如果一条记录从一个索引中被清除,那么记录上由不同事务持有的间隙锁必须被合并。

InnoDB中间隙锁的唯一目的是防止其他事务插入间隙。间隙锁可以共存。一个事务取得的间隙锁并不会阻止另一个事务取得同一间隙上的间隙锁。共享和独占间隔锁之间没有区别。它们彼此之间不冲突,并且执行相同的功能。

5.  Next-Key Locks

 A next-key lock is a combination of a record lock on the index record and a gap lock on the gap before the index record.

next-key锁是索引记录上的记录锁和索引记录之前的间隙锁的组合。

InnoDB执行行级锁的方式是这样的:当它搜索或扫描一个表索引时,它会在遇到的索引记录上设置共享锁或排他锁。因此,行级锁实际上是索引记录锁。索引记录上的next-key锁也会影响该索引记录之前的“间隙”。也就是说,next-key锁是索引记录锁加上索引记录之前的间隙锁。如果一个会话在一个索引中的记录R上有一个共享锁或排他锁,则另一会话无法按照索引顺序在R之前的间隙中插入新的索引记录。

假设一个索引包含值10、11、13和20。该索引可能的next-key锁覆盖以下区间:


(negative infinity, 10]
(10, 11]
(11, 13]
(13, 20]
(20, positive infinity)

默认情况下,InnoDB使用REPEATABLE READ事务隔离级别。在这种情况下,InnoDB使用next-key锁进行搜索和索引扫描,以阻止幻象行。

6.  Insert Intention Locks

Insert Intention Locks(译:插入意向锁)

插入意向锁是一种间隙锁,是由INSERT操作在行插入之前设置的。这个锁表示,如果多个事务插入到同一个索引间隙中,如果它们没有插入到这个间隙中的同一位置,那么它们就不需要等待对方。假设有值为4和7的索引记录。尝试插入值分别为5和6的独立事务,在获得插入行的排他锁之前,每个事务都用插入意向锁锁住4和7之间的间隙,但不会阻塞彼此,因为行是不冲突的。

7.  AUTO-INC Locks

AUTO-INC锁是一种特殊的表级锁,由插入到带有AUTO_INCREMENT列的表中的事务获得。在最简单的情况下,如果一个事务正在向表中插入值,那么任何其他事务都必须等待自己对该表的插入,以便由第一个事务插入的行接收连续的主键值。

https://dev.Mysql.com/doc/refman/5.7/en/innodb-locking.html

以上就是mysql InnoDB 锁的相关总结的详细内容,更多关于Mysql InnoDB 锁的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL InnoDB 锁的相关总结

本文链接: https://www.lsjlt.com/news/10160.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL InnoDB 锁的相关总结
    1.  Shared and Exclusive Locks shared lock (译:共享锁) exclusive lock (译:排它锁、独占锁) InnoDB实现了标准的行级锁,其中有两种类型的锁...
    99+
    2022-05-16
    MySQL InnoDB InnoDB锁
  • MySQL InnoDB架构的相关总结
    目录引言1、Mysql数据库整体架构SQL接口解析器优化器执行器存储引擎2、InnoDB存储引擎架构内存缓冲池undo log日志文件redolog日志文件binlog日志文件InnoDB执行流程引言 作为一个后端...
    99+
    2022-05-28
    MySQL InnoDB MySQL InnoDB架构
  • MySQL 锁的相关知识总结
    MySQL中的锁 锁是为了解决并发环境下资源竞争的手段,其中乐观并发控制,悲观并发控制和多版本并发控制是数据库并发控制主要采用的技术手段(具体可见我之前的文章),而MySQL中的锁就是其中的悲观并发控制。 MySQ...
    99+
    2022-05-14
    MySQL
  • Java与Mysql锁相关知识总结
    目录锁的定义锁的实现JVM中的锁synchronizedReentrantLockMysql 锁共享锁(S) 与排它锁(X)作用范围意向锁作用范围记录锁间隙锁Next-Key Loc...
    99+
    2023-05-16
    Java与MySQL中的锁 Java中使用Mysql数据库实现锁 java mysql锁实现
  • MySQL的几个和innodb相关的主要参数设置总结
    1).innodb_buffer_pool_size 为了提升性能,可以把要写的数据先在缓冲区buffer里合并,然后再发送给下一级存储。这样做可以提高I/O读写的效率。 InnoDB Buffer Poo...
    99+
    2022-10-18
  • mysql的相关设置总结
    下文给大家带来关于mysql的相关设置总结,感兴趣的话就一起来看看这篇文章吧,相信看完mysql的相关设置总结对大家多少有点帮助吧。1.安装MySQL    使用管理...
    99+
    2022-10-18
  • mysql字符集相关总结
    这边笔记主要记录一下对mysql字符集相关知识的学习 字符集 一般我们使用如下语句创建一张表,创建表的时候指定了charset为utf8编码。 CREATE TABLE `test` ( `c1` int U...
    99+
    2022-05-22
    MySQL 字符集
  • 【mysql】索引相关的个人总结
    重点参考: MySQL索引原理及慢查询优化 (美团技术分享网站):原理、示例优化都写的很好。 索引很难么?带你从头到尾捋一遍MySQL索引结构,不信你学不会!:原理写的很好。 【从入门到入土】令人脱发的数据库底层设计:很详细...
    99+
    2016-06-26
    【mysql】索引相关的个人总结
  • MySQL数据迁移相关总结
    前言: 在平时工作中,经常会遇到数据迁移的需求,比如要迁移某个表、某个库或某个实例。根据不同的需求可能要采取不同的迁移方案,数据迁移过程中也可能会遇到各种大小问题。本篇文章,我们一起来看下 MySQL 数据迁移那些事...
    99+
    2022-05-20
    MySQL 迁移 MySQL 数据迁移
  • MySQL 日志相关知识总结
    数据库中用于存储数据的文件称为data file,日志文件称为log file。此外,如果每次读写都是直接访问磁盘,性能很差,所以数据库是有缓存的,数据缓存是data buffer,日志缓存log buffer。 s...
    99+
    2022-05-21
    MySQL 日志
  • MySQL权限相关知识总结
    本篇内容主要讲解“MySQL权限相关知识总结”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL权限相关知识总结”吧! 一.权限表 mysql中的3个权...
    99+
    2022-10-18
  • Mysql锁总结
    数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来 实现这些访问规则的重要数据结构 根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类 全局锁...
    99+
    2014-11-05
    Mysql锁总结
  • 操作MySQL表相关要义总结
    下面讲讲关于操作MySQL表相关要义,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完操作MySQL表相关要义这篇文章你一定会有所受益。使用编辑器编辑指令edit创建表create...
    99+
    2022-10-18
  • MySQL 慢日志相关知识总结
    目录  1.慢日志简介  2.慢日志实战  1.慢日志简介 慢日志全称为慢查询日志(Slow Query Log),主要用来记录在 MySQL 中执行时间超过指定时间的 SQL 语句。通...
    99+
    2022-05-22
    MySQL 慢日志
  • 转:Mysql 分区 分表相关总结
    拆分策略选择 其实拆分很灵活,有的是垂直切分,将一个库拆成两个或多个,将有相关联的表放在一个库里。有的是水平切分将数据量大的表按照一定逻辑进行拆分。个人感觉垂直切分的相对来说缓解了IO的瓶颈,而水...
    99+
    2022-10-18
  • Java基础之线程锁相关知识总结
    一、 synchronized关键字 1.对象锁 a.当使用对象锁的时候,注意要是相同的对象,并且当有线程正在访问对象锁内部的代码的时候,其他线程无法访问。(注意无法访问的范围)。 ...
    99+
    2022-11-12
  • MySQL 外键约束和表关系相关总结
    目录外键(Foreign Key)如何确定表关系如何建立表关系一对多关系 - 员工表和部门表多对多一对一表关系总结外键(Foreign Key) 按照上述所说,一张表存储员工信息会极大的浪费资源,重复数据太多,这个...
    99+
    2022-05-18
    MySQL 外键约束 MySQL 表关系
  • Mysql相关知识总结-持续更新~~~
         2019-12-11对varchar类型排序问题的解决 在mysql默认order by 只对数字与日期类型可以排序,但对于varchar字符型类型排序好像没有用了,下面我来给各位同学介绍varchar类型排序问题如何解决。 现象...
    99+
    2019-06-22
    Mysql相关知识总结-持续更新~~~
  • 关于MYSQL INNODB index page header学习和实验总结
    关于INNODB  index header 所用到的工具是自己写的mysqlblock和bcview, 我放到了百度云盘 http://pan.baidu.com/s/1num76RJ 供大...
    99+
    2022-10-18
  • 总结HTML相关知识
    这篇文章主要介绍“总结HTML相关知识”,在日常操作中,相信很多人在总结HTML相关知识问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”总结HTML相关知识”的疑惑有所帮助!接...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作