mysql 间隙锁

news2024/12/28 18:04:15

mysql 默认是可重复读的隔离级别,这种默认会有幻读,幻读指的什么现象呢,就是在同一个事物中前后两次查到的结果不一致,那么mysql是怎么解决幻读的呢,这就是mvcc

mvcc

什么是mvcc呢,就是多版本并发控制,具体是通过undolog来进行实现的,先来说下事物吧,每个事务开始,都会记录当前readview,包含的就是当前进行中的事物,最大的事务id,主要就是为了处理当前事务对那些数据可见,当数据进行增加修改删除的时候,会生成对应的一条undollog,里面记录了数据的事务id,也就是通过哪个事务进行修改的来的,对应的事务id是不是对当前事务可见,如果不可见的,就顺着undolog链表向上查找,找到对当前可见的数据,这样的readview 和 undolog组成了mvcc,也就是处理了幻读的问题,新增修改删除对当前事务都不可见,这种称之为快照读,那么就还有一个当前读,也就是select for update,或者说直接修改 update table set age=18 where name =‘lisi’ 其实修改也是需要当前读的,需要先查找到对应的数据才能进行修改。

mysql 怎么处理当前读的幻读问题呢

当前读就不能走快照了,要查实际的数据,但是还不能幻读,也就是要加锁,最简单的实现就是加上表锁,这样别的请求都不能修改,但是并发粒度比较低,,性能差,mysql是怎么做的呢,采用的是gap lock,也就是间隙锁,间隙锁可以锁定记录之间的返回,比如select * from table where age=18 for update,如果age没有索引,那么就锁整个表,修改删除等操作要注意索引,如果存在索引,存在当前记录的话,会锁记录以及记录周围的间隙,如果不存在记录,就向前找到比18小的,向后找到比18大的,进行加间隙锁,间隙锁之间是不冲突的,也就是多个事务都可以加间隙锁,因为间隙锁就是为了防止对这个范围内的数据进行修改,多次间隙锁不冲突,但是,如果想要再去添加数据,那么就需要等待,如果两个事务都想添加,那么就死锁了

间隙锁影响范围内的增加删除和修改吗?

有时候听到有人会这么问,其实这个对间隙锁表述不正确,间隙锁锁的就是没有数据的范围,所以不存在修改和删除的问题,阻止插入,那么为什么有人这么问呢,因为没把间隙锁,记录锁,next-key lock详细区分,记录锁就是锁的一条记录,间隙锁加上记录锁就是next-key lock 也叫临键锁,间隙锁之间不冲突,但是记录锁之间可是冲突的,常见的修改涉及到一个范围的时候,范围内的记录会加上记录锁,中间范围会有间隙锁,这个时候范围内既不允许增加,也不允许修改和删除

间隙锁导致的死锁场景

什么情况下会间隙锁会导致死锁呢,比如两个事务同时修改一条不存在的记录,这时候会在前后范围加上间隙锁,如果再进行插入数据,那么就都需要插入锁,需要等待对方释放间隙锁,这时候就发生了死锁。

常见的避免死锁的办法

  • 对于特定场景修改的时候,可以先查询出来,再根据主键进行修改,或者插入
  • 设置事务等待锁的超时时间。当一个事务的等待时间超过该值后,就对这个事务进行回滚,于是锁就释放了,另一个事务就可以继续执行了。在 InnoDB 中,参数 innodb_lock_wait_timeout 是用来设置超时时间的,默认值时 50 秒。当发生超时后,就出现下面这个提示:

  • 开启主动死锁检测。主动死锁检测在发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑,默认就开启。当检测到死锁后,就会出现下面这个提示:

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

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

相关文章

数据结构之树(图解)

文章目录 前言一、树是什么?二、树的特点三、树的相关概念四、树的表示方法(孩子兄弟表示法)总结 前言 在学习完线性结构,例如顺序表、链表、栈、队列后,我们要开始学习一个新的数据结构----树 一、树是什么&#xf…

超全整理,Jmeter性能测试-脚本error报错排查/分布式压测(详全)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能脚本error报错…

iOS 使用dsym符号化线上crash日志(ips文件)

1.获取崩溃日志 可以iphone连接mac复制当时的崩溃日志。 Xcode->Window->Devices View Device Logs 如果是testflight的崩溃是可以分享的,分享出来可能是ips文件。 把文件名称改成my.crash 使用脚本把新版本崩溃日志转成老版本格式 这一步不是必须的&…

c++小惊喜——stringstream

当需要读取一行字符串时&#xff0c;我们通常会有将这个字符串分开的想法 #include<iostream> #include<sstream> using namespace std;int main() {string str;getline(cin, str);stringstream ssin(str);string s[10];int cnt 0;while (ssin >> s[cnt]) …

vue实现记事本(含样式)

实现增加、删除、全删、合计功能。 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport&q…

中文复制到ubuntu内变为乱码

如果你将中文文本复制到 Ubuntu操作系统内后出现乱码&#xff0c;这可能是字符编码设置不正确所致。 检查终端编码设置&#xff1a; 在终端中&#xff0c;确保你的终端编码设置正确。你可以使用locale 命令来检查系统的默认编码 设置。一般来说&#xff0c;UTF-8是一种广泛支持…

【K8s】白话容器基础(二):隔离与限制

白话容器基础&#xff08;二&#xff09;&#xff1a;隔离与限制 容器与虚拟机 在上一篇文章中&#xff0c;我详细介绍了 Linux 容器中用来实现“隔离”的技术手段&#xff1a;Namespace。而通过这些讲解&#xff0c;你应该能够明白&#xff0c;Namespace 技术实际上修改了应…

如何本地部署Jellyfin影音服务器并实现在公网访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

如何做好企业的设备维护和保养?报修工单管理系统软件有哪些?

随着信息化技术的飞速发展&#xff0c;企业运营的各个方面都在逐步实现信息化。设备维护作为企业运营中的重要环节&#xff0c;其可靠性对于企业的正常运营至关重要。报修工单管理系统软件作为解决这一问题的有效方案&#xff0c;已经受到业界的广泛关注。本文将从测评专家的角…

window安装es服务及删除

elasticsearch-service.bat install 删除es服务&#xff0c;先停止es服务运行&#xff0c;管理员cmd模式&#xff0c;sc delete "elasticsearch-service-x64"

基于安卓Android的城市公交查询app

项目介绍 本课题城市公交线路查询&#xff0c;采用安卓平台&#xff0c;所完成的可扩展性、可靠性以及可重用性的城市公交线路查询系统&#xff0c;以满足现实生活的需要。数据库选用MySQL。 前端为移动端&#xff0c;采用安卓框架uniapp&#xff0c;开发软件为Android Studio…

【方法】Excel表格如何禁止查看公式?

在日常工作中&#xff0c;很多人会选择用Excel来做数据表格&#xff0c;有时候还要通过公式来做数据。那如果计算数据所用的公式不想让别人看到&#xff0c;可以怎么做呢&#xff1f;今天小编就来分享一下&#xff0c;如何设置Excel表格禁止查看公式。 以下图表格为例&#xf…

String 字符串不可变带来的好处是什么?

目录 1. 线程安全(数据安全) 2. 节约内存 3. 提高集合的存取效率 1. 线程安全(数据安全) 众所周知&#xff0c;String 字符串是默认被 final 修饰的&#xff0c;是不可变的&#xff0c;那么首先能想到的一个优点就是线程安全&#xff0c;String 是存放在堆中的&#xff0c;是…

NSSCTF 2nd Web 题目复现

php签到 考点&#xff1a; 1.上传表单html的编写 2./. 绕过黑名单&#xff08;在Linux系统下1.php.是一个合法的文件名&#xff0c;系统不会自动把最后的点去掉并把文件当成php文件执行&#xff0c;所以点绕过只在Windows下有用&#xff09; 源代码&#xff1a; <?phpfun…

ICS TRIPLEX T9432 电源模块

电源模块是电子装备中的重要组成部分&#xff0c;用于供给电能以供给装备中的各种电子元件和电路。电源模块具备多种特征&#xff0c;以保证供给稳定、否靠的电源&#xff0c;顺应不同运用的需要。以下是电源模块的一些主要特征&#xff1a; 电压和电流输入&#xff1a; 电源模…

纬创出售印度子公司给塔塔集团,结束iPhone代工业务 | 百能云芯

纬创&#xff08;Wistron&#xff09;董事会于10月27日通过决议&#xff0c;同意以1.25亿美元的价格出售其印度子公司Wistron InfoComm Manufacturing (India) Private Limited&#xff08;WMMI&#xff09;的100%股权给塔塔集团&#xff0c;交割将尽快完成。此举将意味着纬创退…

高效学习之anki新手入门指南(ios端,包括ipad、ihpone设备)————创建、使用、备份、相关资料

文章目录 0 背景0.1 闭环学习0.2 什么是anki 1 开始使用1.1 导入1.2 创建空白组1.3 创建卡片1.3.1 利用anki创建卡片的两种方法1.3.2 复习材料分类 2 操作卡牌&#xff08;位于卡牌界面中“游览”&#xff09;2.1 清空卡牌状态&#xff08;清空之前的“重来”、“困难”、“简单…

电源模块测试用例之电压上升时间测试方案

电压上升时间是电源模块一个非常重要的参数&#xff0c;它直接影响着电路的稳定性。电源模块电压上升过快或过慢都有可能会使系统发生故障&#xff0c;造成设备器件受损。因此&#xff0c;上升时间测试是电源模块测试非常重要的环节。纳米软件电源模块测试系统助力自动化测试&a…

GNN 简介

A Gentle Introduction to Graph Neural Networks A Gentle Introduction to Graph Neural Networks GNN简介 图神经网络&#xff08;GNN&#xff09;是一种基于图结构数据的深度学习模型&#xff0c;用于处理和分析图数据。图数据由节点&#xff08;顶点&#xff09;和边&a…

在Win11上部署ChatGLM3详细步骤

023年10月27日&#xff0c;智谱AI于2023中国计算机大会&#xff08;CNCC&#xff09;上&#xff0c;推出了全自研的第三代基座大模型ChatGLM3及相关系列产品&#xff0c;这也是智谱AI继推出千亿基座的对话模型ChatGLM和ChatGLM2之后的又一次重大突破。此次推出的ChatGLM3采用了…