数据库锁原理

news2024/10/6 6:52:08

数据库锁原理

  • 锁的定义
  • InnoDB中的锁模式
    • 共享锁
    • 独占锁
    • 共享意向锁和独占意向锁
    • LOCK_AUTO_INC自增锁
    • INNODB_AUTOINC_LOCK_MODE
  • InnoDB中的锁类型
    • 表锁
    • 行锁
  • 行子类型
    • LOCK_REC_NOT_GAP精准行锁
    • LOCK_GAP行GAP锁
    • LOCK_ORDINARY行NEXT-KEY锁
    • LOCK_INSERT_INTENTION插入意向锁

锁的定义

为了体内的事务和事务之间相互不影响而进化出来的功能。

在某个事务操作数据之前,为这些数据加上一把锁,防止其他事务同时操作,在操作完成之后会将锁释放。以便其他事务再次进行上锁执行。

不同的存储引擎中,锁功能也并不相同。

InnoDB中的锁模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

共享锁

可以使用LOCK IN SHARE MODE为数据添加共享锁。

在这里插入图片描述
数据加了共享锁之后,其他事务仍然可以加新的共享锁。但无法添加排他锁。这样就可以在读取数据的时候,阻止数据被其他事务修改。

在这里插入图片描述

独占锁

独占锁,也就是排它锁或写锁,可以通过FOR UPDATE添加。数据加了独占锁之后,直到被释放之前,其他事务将不能再为数据加任何锁。

合理使用共享锁独占锁就可以解决事务间写入隔离的问题,以及脏读、重复读。

不过有关读的问题可以使用效率更高的MVCC解决。

共享意向锁和独占意向锁

也称为IS共享意向锁和IX独占意向锁。

在这里插入图片描述
意向锁就是在上锁时需要在数据所在表上做一个标记,表示这个表已经被加锁。

这样的好处是其他事务为这个表加锁之前,就不需要遍历每一条数据中是否有锁。而只需要看一下表的意向锁即可。大大提升锁判断的效率。

LOCK_AUTO_INC自增锁

LOCK_AUTO_INC自增锁是一个表锁。

配置了AUTO_INCREMENT的自增列服务。

在插入数据时会增加自增锁,然后生成自增值。同时阻塞其他的插入操作,以保证值的唯一。

值得注意的是,如果自增值已经生成,但事务回滚了,自增值也不会回退。也就是说明自增值可能不连续。

INNODB_AUTOINC_LOCK_MODE

通过INNODB_AUTOINC_LOCK_MODE来设置自增锁的机制。

0指自增场景都增加自增锁。

2指自增场景不添加锁直接生成自增值。

这样即使不回滚,在并发插入情况下也会出现不连续。

1默认是在插入数量时采用2机制,而不确定数量时使用0机制。

InnoDB中的锁类型

LOCK_TYPE按照锁的粒度分为:

  1. LOCK_TABLE(表锁)
  2. LOCK_REC(行锁)

在BDB存储引擎中还支持页锁

表锁

表锁指对整张表加锁。

在释放之前拒绝其他事务操作这张表的任何数据。

在特有信息中会记录被锁的表信息。

在这里插入图片描述

行锁

对表内某些行进行加锁。

在特有信息中会记录被锁表的信息以及对应的表空间和页号。

最重要的是会使用一个BIT数组记录哪些行被锁了。

行锁都是添加到MySQL中的数据或者索引中,也就是聚簇索引树或者二级索引树的行中。

在这里插入图片描述
根据不同的查询条件,会选择不同功能的行锁。这就要看一下行子类型。

行子类型

行子类型REC_LOCK_TYPE包括4种:

  1. LOCK_REC_NOT_GAP精准行锁
  2. LOCK_GAP行GAP锁
  3. LOCK_ORDINARY行NEXT-KEY锁
  4. LOCK_INSERT_INTENTION插入意向锁

LOCK_REC_NOT_GAP精准行锁

在这里插入图片描述精准行锁只锁住精准对应的行。

LOCK_GAP行GAP锁

在这里插入图片描述
行GAP锁,锁住行与行之间的间隙。防止在行间隙中插入数据。

LOCK_ORDINARY行NEXT-KEY锁

行NEXT-KEY锁,即是精准行锁和行GAP锁的组合。

在这里插入图片描述
直观来看,这三种行锁的范围会根据不同的WHERE条件进行选择。

LOCK_INSERT_INTENTION插入意向锁

最后插入意向锁是一个特殊的GAP锁,也是共享锁。

如果一个行间隙加了GAP锁,这时其他事务如果要在这个行间隙插入数据,就会加插入意向锁。

由于是共享的,所以多个事务都可以加这个锁。

当GAP锁释放之后,MySQL允许多个插入意向锁同时进行,不需要串行执行,以提升插入效率。

参考资料:5分钟精通数据库锁原理-事务的隔离性

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

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

相关文章

数据分析之Matplotlib 基础入门

目录 第一章 什么是Matplotlib 常见图表及其分类 Matplotlib 第一个绘图程序 第二章 Matplotlib 基础 Matplotlib 图表常用设置 颜色设置 线条样式和标记样式 画布设置 设置坐标轴标题 设置坐标轴刻度 设置坐标轴范围 设置网格线 设置文本标签和标题 添加图例 添…

Image Deconvolution with the Half-quadratic Splitting Method

Image Deconvolution with the Half-quadratic Splitting Method 在处理图像重建或者逆问题的时候,我们经常会看到一种称为 Half-quadratic Splitting(HQS)的方法,这是在优化领域里非常经典的一种方法,之前也断断续续…

【Cesium 编程第一篇】概述、环境搭建、界面介绍

年前年后一直在面试,发现一个奇怪的现象:很多互联网公司经受住三年的疫情冲击,反而在疫情放开的那一刻撑不住了,很多大厂都在批量的裁员:美国硅谷、北京字节、迪士尼中国等等。在北京的朋友也是年后到现在一直没有找到…

AI是一场革命,我真不是在跟风

AI是场革命,好像现在很多人都开始这么说,那么我说我不是在跟风,为什么?不好意思,又要翻翻旧贴 -> AI是一场革命,不要笑,我是认真的。2016年我就这样讲了,就如我常说的&#xff0c…

【《中国工业经济》论文复刻】“一带一路”倡议与中国企业升级

数据和变量描述 本部分介绍文章研究所使用的数据和关键变量。 数据来源:自主整理 时间范围:2012-2017年 变量说明: 相关变量见下表。 一. 摘要 近年来,中国应该如何实现产业升级受到学界的广泛关注,产业升级归根…

Widows下安装Nginx并设置开机自启

1 下载Nginx 下载地址:http://nginx.org/en/download.html 2 启动Nginx nginx的启动方式有两种:一种是直接点击nginx.exe启动,另一种是通过命令行启动 2.1 直接启动 找到nginx目录,双击nginx.exe 即可启动 2.2 命令行启动…

不卷不成魔,新时代的IT人员更需要卷,不卷不成活

简介 从2022年开始至今,IT界发生了很多巨大的变革带来了许多巨大的变化。 这些变革、这些变化导致了有人欢喜有人悲、有人迷茫有人焦虑。1年半来,迷茫、焦虑、精神内耗了也都差不多了,大家都已经认识到了现实,作为凡人的我们所能…

Moviepy模块之多图拼接为一个动图

文章目录前言项目场景项目素材1.jpg2.jpg3.jpg项目代码1. 引入库2. 读取存储图片的文件夹3. 获取文件夹中所有的.jpg结尾的图片文件名4. 按照文件名排序5. 读取所有图片并拼接成动图6. 保存动图问题描述原因分析解决方案最终效果前言 大家好,我是空空star&#xff0…

《花雕学AI》16:BingGPT桌面端的另外一个惊喜—完美整合了新Bing的AI作画功能

你是否曾经想过,如果你能用语言描述你想要的画面,就能让AI为你生成一幅美丽的图画,那该有多好?你是否曾经想过,如果你能在桌面端直接与新Bing进行智能、流畅、有趣的对话,而不需要打开浏览器或安装插件&…

好看的html登录界面,

界面效果&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><title>Login Page</title><style>body {background-color: #f2f2f2;font-family: Arial, sans-serif;}form {background-color: #fff;border-radius: 5px;box-shado…

【LeetCode: 剑指 Offer II 085. 生成匹配的括号 | 递归 | 回溯】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

文本翻译免费软件-word免费翻译软件

好用的翻译文件软件应该具备以下几个方面的特点&#xff1a;支持多种文件格式&#xff0c;翻译结果准确可靠&#xff0c;界面操作简便易用&#xff0c;价格实惠&#xff0c;用户体验舒适。以下是几个好用的翻译文件软件&#xff1a; 1.147cgpt翻译软件 翻译软件特点&#xff1…

Diffusion Models 简单代码示例

一、关于Diffusion 模型的简单介绍 首先diffusion模型和VAE、Flow、Gan等模型类似&#xff0c;均属于生成模型&#xff0c;可以和GCN、CNN等其他深度学习网络相结合&#xff0c;完成特定的生成任务&#xff0c;如下图&#xff1a; 基于 GAN 生成模型&#xff0c;基于 VAE 的生成…

初识二叉树

树的概念与结构 树是一种非线性的数据结构&#xff0c;它是由n个有限结点组成一个具有层次关系的集合&#xff0c;把它叫做树是因为它看起来像一颗倒挂的树&#xff0c;也就是说它的根朝上&#xff0c;而叶朝下的。 子树之间不能有交集&#xff0c;否则就不是树型结构 比如下面…

3dmax间隔选择与循环选择你会用吗?真传干货来了!

文章目录一、循环选择1、AltL&#xff08;线性循环&#xff09;2、AltR&#xff08;环向循环&#xff09;3、在线选择上altR和altL的差别二、 间隔选1、选一隔一2、选二隔一3、选二隔二4、隔三选一5、面的间隔选择总结6、线的间隔选文章原出处&#xff1a; https://blog.csdn.n…

TCP拆包粘包问题

什么是粘包&#xff1f; 首先明确TCP时面向字节流的协议&#xff08;当用户消息通过 TCP 协议传输时&#xff0c;消息可能会被操作系统分组成多个的 TCP 报文&#xff0c;也就是一个完整的用户消息被拆分成多个 TCP 报文进行传输&#xff09;&#xff0c;UDP是面向报文的协议&…

【ChatGPT】AI发展如此火热,程序员的发展呢?

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 目录一、AI已来&#xff0c;ChatGPT你用上了吗&#x1f33e;二、AI之路&#xff0c;这是社会在发展&#x1f331;三、AI时代&#xff0c;程序员应该怎么做&#x1f334;一、AI已来&#xff0c;ChatGPT你用上了吗&…

【Python】基于ML307A的位置读取系统(通过UART串口实现AT指令和flask来实现自动化读取并推流)

【Python】基于ML307A的位置读取系统&#xff08;通过UART串口实现AT指令和flask来实现自动化读取并推流&#xff09; Python下的串口serial库 串行口的属性&#xff1a; name:设备名字 portstr:已废弃&#xff0c;用name代替 port&#xff1a;读或者写端口 baudrate&#xf…

CUDA效率优化之CUDA Graph的使用

CUDA系列文章 文章目录CUDA系列文章前言一、优化方案简单顺序调用二、Overlapping三、使用CUDA Graph总结前言 GPU 架构的性能随着每一代的更新而不断提高。 现代 GPU 每个操作&#xff08;如kernel运行或内存复制&#xff09;所花费的时间现在以微秒为单位。 但是&#xff0c…

【C++跬步积累】——时间复杂度

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;C跬步积累 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日一题 &#x1f7e1; 每日反刍 &#x1f7e2; 读书笔记 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称王&a…