热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlinnodb几种锁_MySQLInnoDB中各种锁概念

1、共享锁(SharedLocksS锁)和独占锁(ExclusiveLocksX锁):两种标准的行级锁事务持有S锁可以读一行事务持有X锁可以update或delete

1、共享锁(Shared Locks S锁)和独占锁(Exclusive Locks X锁): 两种标准的行级锁

事务持有S锁可以读一行

事务持有X锁可以update或delete一行

如果事务1拿到了R行的S锁,那么事务2也可以同时立即拿到S锁,但是事务2不能立即拿到X锁

如果事务1拿到了R行的X锁,那么事务2不能立即拿到任何类型的锁,必须等待事务1释放R行的X锁

可以理解为X锁与任何锁冲突

2、意向锁(Intention Locks)

innodb支持多粒度封锁,允许行锁和表锁共存

意向锁是表级锁,指示稍后行所需要的锁,有两种:

一、共享意向锁(IS),表示事务将在表的各个行上面加共享锁 SELECT ... LOCK IN SHARE MODE

二、独占意向锁(IX),表示事务将在表的各个行上面加独占锁 SELECT ... LOCK FOR UPDATE

意向锁法则:

①在一个事务获取S锁之前,必须先获取IS锁或者更强的锁

②在一个事务获取X锁之前,必须先获取IX锁

四种锁的兼容性如下:

a1a845a0ba53

兼容性

如果一个事务需要的锁与当前另一个事务持有的锁不冲突,则该锁会被成功授予,否则会等待冲突锁释放。意向锁的主要目的是显示某人正在锁定行,或者要锁定表中的行。

3、行锁(Record Locks)

行锁是对索引记录的锁定,比如SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE会阻止任何事务对

c1=10这一行进行insert、update、delete。就算表没有建索引,行锁也会锁定索引记录,InnoDB创建一个隐藏的聚簇索引,并使用此索引进行记录锁定。

4、区间锁(Gap Locks)

区间锁锁定了多条索引记录之间的内容,或者在第一个之前或最后一个索引记录之后的间隙,比如SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 FOR UPDATE,会阻止其他事务将值15插入到列t.c1中,无论是否已经有了这个值。

使用了唯一索引的表,搜索唯一行则不会用到区间锁(但是搜索条件中包含多个唯一索引字段的话还是可能会有锁的)。比如SELECT * FROM child WHERE id = 100;,如果id拥有唯一索引,则不会加区间锁,如果id没有唯一索引,则会锁住100之前的间隙。

冲突锁可以发生在同一区间,如在同一个区间内,事务一可以有共享区间锁,事务二可以持有独占区间锁。区间锁的唯一目的就是防止其他事务插入区间。一个事务锁住一段区间不影响另一个事务同时锁定,共享区间锁和独占区间锁没有区别,他们都不会相互冲突,并且执行着相同的功能。

可以通过将数据库的隔离级别降低到READ_COMMITTED来指定明确区间锁的间隙,在这些情况下,对于搜索和索引扫描的操作,不会使用到区间锁,仅会用于外键约束检查和重复键检查。

当改变隔离级别到READ_COMMITTED后,mysql会评估WHERE查询条件,并释放不匹配行的行锁。

5、Next-Key Locks

Next-Key Locks表示行锁加这行记录之前的区间锁,如果一个事务在R行拥有S锁或X锁,另一个事务不在R行的索引记录区间之前插入一条新的记录。假设索引的值包含10,11,13,20,那么可能出现next-key lock的区间

(-∞, 10]

(10, 11]

(11, 13]

(13, 20]

(20, +∞)

在REPEATABLE_READ级别,innoDB会在查询和索引扫描中使用Next-Key Lock,来防止幻读

6、插入意向锁(Insert Intention Locks)

插入意向锁是插入之前触发的一种区间锁,这个插入意向锁预示着多个事务可以插入同一个区间,并且不需要等待,除非他们插入的是区间中的同一行

7、AUTO-INC Locks

这是一种特殊的表锁,事务在往数据库中插入自增列的时候会触发。

注:



推荐阅读
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文详细介绍了IBM DB2数据库在大型应用系统中的应用,强调其卓越的可扩展性和多环境支持能力。文章深入分析了DB2在数据利用性、完整性、安全性和恢复性方面的优势,并提供了优化建议以提升其在不同规模应用程序中的表现。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
author-avatar
Manordo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有