首页 > 其他分享 >InnoDB存储引擎中的锁

InnoDB存储引擎中的锁

时间:2024-07-06 12:19:12浏览次数:5  
标签:存储 Record Lock Next 索引 引擎 InnoDB Key

InnoDB存储引擎中的锁


一、锁类型
在 InnoDB 中实现了两个标准的行级锁,可以简单的看为两个读写锁:

S 共享锁:又叫读锁,其他事务可以继续加共享锁,但是不能继续加排他锁。

X 排他锁:又叫写锁,一旦加了写锁之后,其他事务就不能加锁了。

如果一个事务T1已经获得了行r的共享锁,那么另外的事务T2可以立即获得行r的共享锁,因为读取并没有改变行r的数据,称这种情况为锁兼容(Lock Compatible)。但若有其他的事务T3想获得行r的排他锁,则其必须等待事务T1、T2释放行r上的共享锁——这种情况称为锁不兼容。

二、锁的算法

InnoDB存储引擎有3种行锁的算法,其分别是:

Record Lock:单个行记录上的锁

Gap Lock:间隙锁,锁定一个范围,但不包含记录本身

Next-Key Lock∶Gap Lock+Record Lock,锁定一个范围,并且锁定记录本身 作者:河北王校长 https://www.bilibili.com/read/cv15138919/ 出处:bilibili

1. 记录锁(Record-Lock)

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


记录锁是锁住记录的,锁住的是索引记录,而不是我们真正的数据记录:

如果锁的是非主键索引,会在自己的索引上面加锁之后然后再去主键上面加锁锁住。

如果表上没有索引(包括没有主键),则会使用隐藏的主键索引进行加锁。

如果要锁的没有索引,则会进行全表记录加锁。

 

2. 间隙锁

间隙锁顾名思义锁间隙,不锁记录。锁间隙的意思就是锁定某一个范围,间隙锁又叫 gap 锁,其不会阻塞其他的 gap 锁,但是会阻塞插入间隙锁,这也是用来防止幻读的关键。

3. Next-Key Lock

Next-Key Lock是结合了Gap Lock和Record Lock的一种锁定算法,在Next-Key Lock算法下,InnoDB对于行的查询都是采用这种锁定算法。
在InnoDB 默认的事务隔离级别下,即REPEATABLEREAD下,InnoDB存储引擎采用Next-KeyLocking这种锁定算法。例如一个索引有10,11,13和20这四个值,那么该索引可能被Next-Key Locking的区间为:

(-∞,10]
(10,11]
(11,13]
(13,20]
(20,+∞)

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

标签:存储,Record,Lock,Next,索引,引擎,InnoDB,Key
From: https://www.cnblogs.com/hld123/p/18287103

相关文章

  • pwn的linux基础(计算机内部数据结构存储形式)
    linux基础保护层级:分为四个ring0-ring3一般来说就两个,0和30为内核3为用户 权限:用户分为多个组文件和目录等等的权限一般都是三个,即可读可写可执行。读:R,写:W,执行:X赋予一个可执行文件执行权限就是chmod+xfilename虚拟内存和物理内存:物理内存很直白,就是内存......
  • Typecho COS插件实现网站静态资源存储到COS,降低本地存储负载
    Typecho 简介Typecho是一个简单、强大的轻量级开源博客平台,用于建立个人独立博客。它具有高效的性能,支持多种文件格式,并具有对设备的响应式适配功能。Typecho相对于其他CMS还有一些特殊优势:包括可扩展性、不同数据库之间的切换能力、体积小巧以及易于部署上等。Typecho的......
  • 中电金信:加快企业 AI 平台升级,构建金融智能业务新引擎
    ​在当今数字化时代的浪潮下,人工智能(AI)技术的蓬勃发展正为各行业带来前所未有的变革与创新契机。尤其是在金融领域,AI模型的广泛应用已然成为提升竞争力、优化业务流程以及实现智能化转型的关键驱动力。然而,企业在积极拥抱AI的进程中并非一路坦途,而是面临着诸多挑战与痛点。 ......
  • 【Unity几种数据存储之间的区别】PlayerPrefs、Json、XML、二进制、SQLite数据存储之
    ......
  • Camunda流程引擎常用API接口介绍
    本文介绍Camunda7(Camunda7.19.0版本)流程引擎常用API接口,让大家了解Camunda常用的API接口有哪些(包括有:RepositoryService、RuntimeService、TaskService、HistoryService等),项目中如何调用JavaAPI和RESTAPI,尤其是查询API接口,Camunda提供了多种查询方式(包括有:JavaQueryAPI、RES......
  • UWA学堂上新|MMO游戏创建加载游戏角色对应服务器数据存储和读取
    课程是《基于.NetCore开发MMORPG分布式游戏服务器》系列课程第5节,课程旨在帮助大家从零开始搭建商业化MMORPG的分布式服务器框架,包括不同种类服务器的线程模型,如中心服务器、网关服务器、游戏服务器、寻路服务器等,并讲解了这些服务器该如何根据各自的职责进行业务模块分工。 ......
  • 阿里云OSS存储--java
    在yml文件配置属性,使用@Value进行注入@ComponentpublicclassAliOSSUtils{//外部属性注入@Value("${aliyun.oss.endpoint}")Stringendpoint;//@Value("${aliyun.oss.accessKeyId}")@Value("${aliyun.oss.accessKeySecret}")......
  • Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)
    Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)简介OpenEBS是一种开源云原生存储解决方案。OpenEBS可以将Kubernetes工作节点可用的任何存储转化为本地或复制的Kubernetes持久卷。OpenEBS帮助应用和平台团队轻松地部署需要快速、持久耐用、可靠且可扩展......
  • 存储读写之FLASH篇2-本篇内容来自野火文档
    STM32的内部FLASH简介在STM32芯片内部,存在一个重要的FLASH存储器,其主要用途是存储应用程序代码。编写完应用程序后,通常需要使用下载工具将已编译的代码文件写入内部FLASH。不可忽视的是,内部FLASH具有非易失性存储的特性,这意味着在断电后存储的数据不会丢失。每次芯片重新上......
  • Redis 可以根据消息存储时长 将key 删除吗
    是的,Redis可以根据消息的存储时长(TTL,Time-To-Live)自动删除键。您可以通过设置键的过期时间来实现这一点。以下是一些相关的命令和使用示例:设置过期时间的命令EXPIRE:为键设置过期时间(以秒为单位)。EXPIREkeysecondsPEXPIRE:为键设置过期时间(以毫秒为单位)。PEXPIREkey......