MySql Innodb锁机制

锁概述

undo log版本链 + Read View机制实现的MVCC多版本并发控制,可以防止事务并发读写同一数据时出现的脏读+不可重复读+幻读问题。但除脏读+不可重复读+幻读问题外,并发读写同一数据还有脏写问题。就是当多个事务并发更新同一条数据时,此时就可能会出现脏写问题,如下图示:

一.事务A对数据进行操作,将值修改为A;

二.事务B也对该数据进行操作,将值修改为B;

三.接着事务A进行了回滚,将值恢复成NULL;

四.事务B发现数据值B没有了,出现数据不一致;

脏写:一个事务修改了另一个没提交的事务修改过的值,导致数据可能不一致。因为这个没提交的事务有可能会回滚

锁分类

(1)从操作的粒度可分为表级锁、行级锁和页级锁

(2)从操作的类型可分为读锁和写锁

(3)从操作的性能可分为乐观锁和悲观锁

(1)从操作的粒度可分为表级锁、行级锁和页级锁

一.表级锁:每次操作锁住整张表

锁定粒度最大,发生锁冲突概率最高,并发度最低,应用在MyISAM、InnoDB、BDB存储引擎中。

二.行级锁:每次操作锁住一行数据

锁定粒度最小,发生锁冲突的概率最低,并发度最高,应用在InnoDB存储引擎中。

三.页级锁:每次锁定相邻的一组记录

锁定粒度界于表锁和行锁间,开销和加锁时间界于表锁和行锁间。并发度一般,应用在BDB存储引擎中。

(2)从操作的类型可分为读锁和写锁

一.读锁(S锁):共享锁,行级锁

针对同一份数据,多个读操作可以同时进行而不会互相影响。事务A对记录添加了S锁,可以对记录进行读操作,不能做修改。其他事务可以对该记录追加S锁,但是不能追加X锁。要追加X锁,需要等记录的S锁全部释放。

二.写锁(X锁):排它锁,行级锁

当前写操作没有完成前,它会阻断其他事务的写锁和读锁请求。事务A对记录添加了X锁,可以对记录进行读和修改,其他事务不能对记录进行读和修改。

三.IS锁:意向共享锁,表级锁

已加S锁的表肯定会有IS锁,反过来,有IS锁的表不一定会有S锁。

四.IX锁:意向排它锁,表级锁

已加X锁的表肯定会有IX锁,反过来,有IX锁的表不一定会有X锁。

(3)从操作的性能可分为乐观锁和悲观锁

一.乐观锁

一般的实现方式是对记录数据版本进行对比。在数据库表中有一个version字段,根据该字段进行冲突检测。如果有冲突就提示错误信息,所以乐观锁属于代码层面的锁控制。

二.悲观锁

修改一条数据时,为避免被其他事务同时修改,在修改前先锁定。共享锁和排它锁都是悲观锁的不同实现,属于数据库提供的锁机制。

根据加锁的范围,MySQL的锁可以分为:全局锁、表级锁和行级锁三类。

insert 插入流程

针对于事务当中的一笔 insert 操作,过程中的加锁步骤遵循下述流程:

• 1)申请插入意向锁: 本质上是去检查,插入位置所处范围是否存在间隙锁

• 2)唯一键冲突校验: 校验插入记录是否会和已存在记录发生唯一键冲突(Duplicate Key Conflict)

• 3)插入记录并加锁: 若没有唯一键冲突,则插入记录(草稿态),然后对其加行 X Lock

• 4)针对冲突记录加锁: 若发生唯一键冲突,则对引起冲突的行记录左右空隙加间隙锁,并申请该行记录的 S Lock

• 5)冲突记录双重校验:成功后,需要 double check 冲突记录的合法性,是的话返回唯

死锁案例

基于上述流程,下面分享一个因为 INSERT 操作而引发死锁的案例.

在操作开始前,数据表初始的数据状况如下表所示:

具体执行 SQL 如下表,在时刻 3 事务 B 插入 key = n 时因遭遇唯一键冲突,会对记录加左右间隙锁,并因为申请冲突记录的 S Lock 而陷入阻塞;而事务 A 在时刻 4 尝试插入 key = m 时则会因为事务 B 施加的间隙锁而陷入阻塞,最终形成死锁:

事务 A -> 等待事务 B 释放 key = n 的左右间隙锁

事务 B -> 等待事务 A 释放 key = n 的 X Lock

案例延伸探讨 

针对上述死锁案例,我们额外展开探讨一个细节点:

案例中形成死锁的一个重要原因在于,事务 B 遭遇唯一键冲突后,选择先加间隙锁,再申请冲突记录的 S Lock,正是这样的加锁顺序才导致事务 A 后续的 INSERT 操作发生阻塞,最后引起锁资源的循环依赖.

试想一下,事务 B 在唯一键冲突后不申请间隙锁而是仅加冲突记录的行 S Lock(猜想一) ,亦或是把加锁顺序调整为先加行 S Lock,再加间隙锁(猜想二) ,这样是否就能够规避死锁问题呢?

针对猜想一,我们论证一下加间隙锁的必要性.

通过下述 SQL 我们演示一个不加间隙锁而导致的 badcase:

在时刻 3 事务 B 阻塞等待冲突记录行 S Lock,随后时刻 4 事务 A 回滚,因此事务 B 成功获得该行的 S Lock,并且发现行记录已经被删除,判断唯一键冲突问题已解;但与此同时,一个并发执行的事务 C 在此时见缝插针,又插入了一条唯一键相同的记录,这样就会导致事务 B 针对唯一键冲突的校验结果失准.

针对猜想二,其实存在的问题和猜想一是一样的,就是倘若事务 A 回滚,此时没有有效的手段拦截第三方并发事务的插入行为,因此事务 B 才需要先加间隙锁,阻止其他事务的并发插入行为,再进行后续的加行锁和校验操作.

基于 SQL 展示的反例如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【CT】LeetCode手撕—199. 二叉树的右视图

目录 题目1- 思路2- 实现⭐199. 二叉树的右视图——题解思路 3- ACM 实现 题目 原题连接&#xff1a;199. 二叉树的右视图 1- 思路 使用二叉树的层序遍历 2- 实现 ⭐199. 二叉树的右视图——题解思路 class Solution {public List<Integer> rightSideView(TreeNode ro…

Let‘s Encrypt 申请免费 SSL 证书(每隔60天自动更新证书)

文章目录 官网文档简介安装 Nginxacme.sh生成证书智能化生成证书 安装证书查看已安装证书更新证书 官网 https://letsencrypt.org/zh-cn/ 文档 https://letsencrypt.org/zh-cn/docs/ 简介 Let’s Encrypt 是一个非营利组织提供的免费SSL/TLS证书颁发机构&#xff0c;旨在促…

如何在 Windows 10 或 11 中恢复已删除的文件

您在 Windows PC 上找不到某个文件&#xff0c;并且您觉得可能已将其删除。我们都遇到过这种情况。但与其抱怨&#xff0c;不如尝试恢复它。假设您已经搜索过回收站&#xff0c;但一无所获&#xff0c;那么是时候求助于一个好的恢复工具了。 微软提供了自己的命令行恢复程序&a…

Vite: 插件流水线之核心编译能力

概述 Vite 在开发阶段实现了一个按需加载的服务器&#xff0c;每一个文件请求进来都会经历一系列的编译流程&#xff0c;然后 Vite 会将编译结果响应给浏览器。在生产环境下&#xff0c;Vite 同样会执行一系列编译过程&#xff0c;将编译结果交给 Rollup 进行模块打包这一系列…

Node端使用工作线程来解决日志开销-处理IO密集型任务

我们的BBF层很多时候会作为中间层处理后端到前端的数据&#xff0c;当然大部分时候都只是作为请求 / 响应的数据组装中心&#xff0c;但是有一个插件是怎么都绕不过去的&#xff1a;Log4js。 内部我们在Node层打印了很多日志。结果这周仔细分析了一下服务器处理请求到响应的中间…

excel数据大小显示竟然有最大限制,限制32,767,实际限制32759

Excel 单元格在显示数据时确实存在一些限制&#xff0c;这些限制主要与单元格的宽度和高度有关&#xff0c;而不是存储数据的大小。以下是一些主要的限制&#xff1a; 1. **列宽和行高**&#xff1a;Excel 单元格的显示大小取决于列宽和行高。如果单元格中的数据超出了设定的列…

C# Winform项目中简单使用Sqlite并在DataGridview中显示

1. SQLite概述 1.1 什么是 SQLite&#xff1f; SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。 1.2 为什么要用 …

vmware虚拟机安装openEuler

一、openEuler简介 openEuler是一款开源操作系统。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云计算、…

游戏AI的创造思路-技术基础-自然语言处理

自然语言处理-可以对游戏AI特别是RPG类、语言类游戏进行“附魔”&#xff0c;开发出“随机应变”和你聊天的“女友”、“队友”或者是根据你定义的文本库来用接近自然语言的生成“语言”&#xff0c;推动游戏情景在受控范围内前进 目录 1. 自然语言处理定义 2. 发展历史 3. …

k8s部署单节点redis

一、configmap # cat redis-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: redis-single-confignamespace: redis data:redis.conf: |daemonize nobind 0.0.0.0port 6379tcp-backlog 511timeout 0tcp-keepalive 300pidfile /data/redis-server.pidlogfile /d…

高考服务系统

摘 要 每年有大批考生在进行填写高考志愿时并不很清楚自己的高考分数适合那些高校以及专业。高考考生面临着未被高校录取&#xff0c;被调剂专业&#xff0c;甚至可能复读的问题。若能让考生轻松查询到高校录取、高校专业、高校招生等相关信息&#xff0c;能减少很大一部分考生…

《后端程序猿 · Caffeine 本地缓存》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻一周&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

SolrCloud Autoscaling 自动添加副本

SolrCloud Autoscaling 自动添加副本 前言 问题描述 起因是这样的&#xff0c;我在本地调试 Solr 源码&#xff08;版本 7.7.3&#xff09;&#xff0c;用 IDEA 以 solrcloud 方式启动了 2 个 Solr 服务&#xff0c;如下所示&#xff1a; 上图的启动参数 VM Options 如下&am…

QT控制comboBox切换方法

目录 1. 效果2. 操作 1. 效果 如下图&#xff1a; 点击全切换雨天模式按钮 则 comboBox 文本显示为 “雨天模式”点击全切换正常模式按钮 则 comboBox 文本显示为 “雨天模式” 切换到 雨天模式 切换到 正常模式 2. 操作 使用 “setCurrentIndex” 方法&#xff0c;切换 combo…

vmware虚拟机增加磁盘容量

概述 当初始分配给虚拟机的磁盘空间不够时&#xff0c;需要从外部的主系统增加配给。 具体操作分为两步&#xff1a;一&#xff1a;通过虚拟机界面添加分配的磁盘配给&#xff1b;二&#xff1a;将新分配的配给给使用起来。 操作 添加磁盘配给 在虚拟机内部添加新分配的配给…

安装Intel Realsense D435i驱动与ROS包报错

1.下载安装realsense SDK 1.1 安装依赖 sudo apt install libudev-dev pkg-config libgtk-3-dev sudo apt install libusb-1.0-0-dev pkg-config sudo apt install libglfw3-dev sudo apt install libssl-dev1.2 权限 cd librealsense/ sudo cp config/99-realsense-libusb.…

独享代理VS共享代理,新手选择攻略

随着互联网的广泛普及和应用&#xff0c;涉及网络隐私、数据安全和网络访问控制的问题变得越来越重要。代理服务器作为一种常见的网络工具&#xff0c;可以在跨境电商、海外社媒、SEO投放、网页抓取等领域发挥作用&#xff0c;实现匿名访问并加强网络安全。在代理服务器类别中&…

GoLand 2024 for Mac GO语言集成开发工具环境

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

哪个牌子的充电宝牌子便宜好用?2024年性价比高充电宝排行榜!

在 2024 年&#xff0c;充电宝市场依旧琳琅满目&#xff0c;让人眼花缭乱。大家都在寻找那个既便宜又好用的充电宝&#xff0c;可面对众多品牌和产品&#xff0c;常常感到无从下手。别担心&#xff01;经过深入的市场调研和实际使用体验&#xff0c;我们为您精心整理出了 2024 …

掌握空投,预见未来:空投教程网,撸毛党的必备工具

随着区块链技术的发展&#xff0c;越来越多的人开始关注这一领域。对于很多人来说&#xff0c;如何有效地参与区块链项目&#xff0c;尤其是空投活动&#xff0c;成为了一个重要的问题。为了解决这一问题&#xff0c;“空投教程网”应运而生。作为一个专为撸毛党设计的工具&…