【MySQL进阶之路 | 高级篇】数据操作类型的角度理解共享锁,排他锁

1. 从数据操作的类型划分:读锁,写锁

对于数据库并发事务的读-读情况并不会引起什么问题。对于写-写,读-写操作或写-写操作这些情况可能会引起一些问题,需要使用MVCC或者加锁的方式来解决它们。在使用加锁的方式解决问题时,由于既要允许读-读的情况不受影响,又要使得写-写,读-写/写-读情况的操作相互阻塞,所以MySQL实现一个由两种类型的锁组成的锁系统来解决。这两种类型的锁通常被叫做共享锁和排他锁。

  • 读锁:也称为共享锁,英文用S表示。针对同一份数据,多个事务的读操作可以同时进行而不会相互影响。相互不阻塞。
  • 写锁:也称为排他锁,英文用X表示。当前写操作没有完成时,它会阻断其他写锁和读锁。这样就能确保在给定的时间里,只有一个事务能执行写入,并防止其他用户读取正在写入的同一资源。

需要注意的是对于InnoDb存储引擎来说,读锁和写锁可以加在表上,也可以加在行上。

举例(行级读写锁):如果一个事务T1已经获得了某个行r的读锁,那么此时另外一个事务T2是可以获得这个行的读锁的,因为读取操作并没有改变行r的数据。但是如果某个事物T3向获得行r的写锁,则它必须等待事务T1和T2释放掉行r上的读锁才行。

总结:这里的兼容是指对同一张表或记录的锁的兼容性情况:

2. 锁定读

在采用加锁方式解决脏读,不可重复读,幻读这些问题时,读取一条记录时需要获取记录的S锁,其实是不严谨的。有时候需要在读取记录的时就获取记录的X锁,来禁止别的事务读写该记录。为此MySQL提出了两种比较特殊的select语句格式。

  • 对读取的记录加S锁:
select ... lock in share mode;# mysql8.0新增语法
select ... for share;

在普通的select语句后加上lock in share mode,如果当前事务执行了该语句,那么它会为读取的记录加S锁,这样允许别的事物继续获取这些记录的S锁,但不能获取该记录的X锁(比如使用select ... for update语句来取这些记录,或者直接修改这些记录)。如果别的事务想要获取这些记录的X锁,那么它们会阻塞,直到当前事务提交后将这些记录的S锁释放掉。

  • 对读取的记录加X锁:
select ... for update;

在普通的select语句后面加for update,如果当前事务执行了该语句,那么它会为读取到的记录加S锁,这样不允许别的事务获取这些记录的S锁,也不允许获得这些记录的X锁。如果别的事务想要获取这些记录的S锁或者X锁,那么它们会阻塞,直到当前的事务提交后将这些记录上的X锁释放。

MySQL8.0新特性:

在5.7版本以前,select ... for update,如果获取不到锁,会一直等待,直到innodb_lock_wait_timeout超时。在8.0版本中,select ... for update,select ... for share添加nowait,skip locked语法,跳过锁等待,或者跳过锁定。

通过添加上述语法,能够立即返回。如果查询的行已经加锁:

  • 那么nowait会立即报错返回。
  • 而skip locked也会立即返回,只是返回的结果中不包含被锁定的行。

3. 写操作

平常用到的写操作无非是DELETE,UPDATE,INSERT这三种:

DELECT:

对一条记录做DELETE操作的过程其实是先在B+树中定位到这条记录的位置,然后获取这条记录的X锁,再执行delete mark的操作。我们也可以把这个定位待删除记录在B+树位置的过程看成是一个获取X锁的锁定读。

INSERT:

一般情况下:新插入的一条记录并不加锁,通过一种隐式锁的结果来保护这条新插入的记录在本事务提交前不被别的事务访问。

UPDATE:在对一条记录做UPDATE操作时分为三种情况:

  • 情况1:未修改该记录的主键值,并且被更新的列占用的存储空间在修改前后未发生变化。则先在B+树 中定位到这条记录的位置,然后获取一下记录的X锁,最后在原纪录的位置进行修改操作。我们也可以把这个定位待修改记录在B+树位置的过程看作是一个获取X锁的锁定读。
  • 情况2:未修改该记录的主键值,并且至少由一个被更新的列占用的存储空间在修改前后发生变化。则先在B+树中定位到这条记录的位置,然后获取一下记录的X锁,将该记录彻底删除(就是把这个记录移入垃圾链表),最后插入一条新的记录。这个定位待修改记录在B+树中的位置的过程看作是一个获取X锁的锁定读,新插入的记录由INSERT操作提供的隐式锁及逆行保护。
  • 情况3:修改了该记录的主键值,则相当于在原纪录上做DELETE操作之后再进行INSERT操作,加锁操作就需要按照DELETE和INSERT的规则进行。

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

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

相关文章

photoshop学习笔记——选区3 快速选择工具

快速选择工具 W shift W 在3种快速选择工具之间切换 对象选择工具 photoshop CC中没有这个工具,利用AI,将款选中的对象快速的提取选区,测试了一下,选区制作的非常nice快速选择工具 跟磁性套索类似,自动识别颜色相似…

如何快速抓取小红书帖子评论?两大实战Python技巧揭秘

摘要: 本文将深入探讨两种高效的Python方法,助您迅速获取小红书文章下方的所有评论,提升市场分析与用户洞察力。通过实战示例与详细解析,让您轻松掌握数据抓取技巧,为您的内容营销策略提供有力支持。 如何快速抓取小…

C++ | Leetcode C++题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; template <class T> class PeekingIterator : public Iterator<T> { public:PeekingIterator(const vector<T>& nums) : Iterator<T>(nums) {flag Iterator<T>::hasNext();if (flag) {nextElement Ite…

[Unity] ShaderGraph实现不同贴图素材的同一材质球复用

无意间发现的ShaderGraph小技巧&#xff0c; 可以实现同一个ShaderGraph&#xff0c;同一个Material材质球&#xff0c; 但使用不同的Texture贴图&#xff0c;而Sprite显示不会相互覆盖。 具体实现方法如下&#xff1a; 声明Texture2D时&#xff0c;把名字命名成&#xff1a…

如何设置postgresql数据库的账户密码

说明&#xff1a;在我的云服务器上&#xff0c;postgres是使用yum的方式安装的&#xff0c;不需要设置postgres账户的密码&#xff0c;本文介绍安装后如何手动设置postgres账户的密码&#xff1b; postgres数据库安装&#xff0c;参考下面这篇文章&#xff1a; PostgreSQL安装…

SMS-Activate 接码

pip install smsactivate from smsactivate.api import SMSActivateAPI 1. 获取密匙 在https://sms-activate.io/cn/api2#balans页面点击生成密匙 2. 查看所需服务的代码符号&#xff0c;点击见表 查看国家代码符号点击见表 3. 获取手机号 def get_phone_new(self):api SMS…

Intel任命Micron技术开发主管领导Intel Foundry制造运营

- **新闻要点**&#xff1a;Intel聘请了Micron的技术开发主管Dr. Naga Chandrasekaran担任首席全球运营官、执行副总裁以及Intel Foundry制造和供应链组织的总经理。他将负责Intel的所有制造运营事务。 #### 任命背景 - **领导团队**&#xff1a;Chandrasekaran将成为Intel执行…

MySQL 查询 limit 100000000, 10 和 limit 10 速度一样快吗?

MySQL 查询 limit 100000000, 10 和 limit 10 速度一样快吗&#xff1f; MySQL内部分为server层和存储引擎层。一般情况下存储引擎都用innodb。 server层有很多模块&#xff0c;其中需要关注的是执行器是用于跟存储引擎打交道的组件。 执行器可以通过调用存储引擎提供的接口&…

Transformer-Bert---散装知识点---mlm,nsp,较之经典tran的区别和实际应用方式

本文记录的是笔者在了解了transformer结构后嗑bert中记录的一些散装知识点&#xff0c;有时间就会整理收录&#xff0c;希望最后能把transformer一个系列都完整的更新进去。 1.自监督学习 bert与原始的transformer不同&#xff0c;bert是使用大量无标签的数据进行预训练&#…

LINUX 孤儿进程和僵尸进程

1、孤儿进 一个父进程退出&#xff0c;而它的一个或多个子进程还在运行&#xff0c;那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养&#xff0c;并由init进程对它们完成状态收集工作 为了释放子进程的占用的系统资源&#xff1a; 进程结束之后&#xf…

意象万千的紫

文章目录 引言中国紫梦幻紫莫奈紫引言 2024巴黎奥运会的临近,很多网友都被“法式浪漫奥运紫”惊艳了,大到赛场跑道,小到一个羽毛球的设计,紫色的嵌入使竞技体育增添了不少梦幻的感觉。 中国紫 清代: 陈曾寿 【 雪青衫子绮罗新,一晌当前色相真】 青莲 五代十国李璟 “青…

mysql数据库管理(2)

数据库增删改查 将sql文件传到Linux /home目录下面 mysql –uroot –p create database test; use test; source myemployees.sql&#xff08;如果在home目录下&#xff0c;直接source .sql&#xff09; show tables; select * from departments; ps&#xff1a;SQL 语言大小写…

开始尝试从0写一个项目--前端(三)

器材管理板块 添加器材管理导航 src\views\home\Home.vue src\router\index.js src\views\equipment\Equipment.vue <template><div>hello!</div></template> 测试 搜索导航分页查询 src\views\equipment\Equipment.vue <template><div&…

《动手做科研 》| 01.AI的最新进展与科研应用

地址链接:《动手做科研》01. AI的最新进展与科研应用 导读: 该部分介绍AI的最新进展以及在科研各个领域的应用 目前AI发展到什么程度了&#xff1f;哪些问题可以尝试用AI解决呢&#xff1f;如何快速构建一个属于自己的AI应用程序&#xff1f; 本教程目标&#xff1a; 与语言模…

【C++笔试强训】day01

数字统计 思路 用%10取出个位的数字&#xff0c;用/10迭代。 代码 #include <iostream> using namespace std;int main() {int l, r, res 0;cin >> l >> r;for (int i l; i < r; i){int x i;while (x){if (x % 10 2) res;x / 10;}}cout << r…

GPT-4O 的实时语音对话功能在处理多语言客户时有哪些优势?

最强AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 我瞄了一眼OpenAI春季发布会&#xff0c;这个发布会只有26分钟&#xff0c;你可以说它是一部科幻短片&#xff0c;也可以说它过于“夸夸其谈”&#xff01;关于…

计算机网络实验-RIP配置与分析

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、相关知识 路由信息协议&#xff08;Routing Information Protocol&#xff0c;RIP&#xff09;是一种基于距离向量&#xff08;Distance-Vector&…

推荐3款将相片变为动漫风格的免费AI工具推荐

toonme ToonMe是一款功能强大的在线和移动端应用&#xff0c;专门用于将照片转换成卡通风格图像。该工具利用先进的AI技术&#xff0c;能够快速识别照片中的面部特征&#xff0c;并进行智能处理&#xff0c;生成高清晰度的卡通肖像。 功能特点 ToonMe通过其内置的人工智能算法…

【STL之·容器·queue】

系列文章目录 文章目录 前言一、概述1.1 特点&#xff1a;1.2 queue的工作原理和内部实现 二、基本操作三、性能分析3.1 STL队列的时间复杂度和空间复杂度3.2 STL队列和自定义队列的性能差异 四、实例演示总结 前言 常见的应用场景包括&#xff1a; 任务调度&#xff1a; 队列可…

Dav_笔记11:SQL Tuning Overview-sql调优 之 5

构建SQL测试用例 对于许多与SQL相关的问题&#xff0c;获得可重现的测试用例可以更轻松地解决问题。从11g第2版&#xff08;11.2&#xff09;开始&#xff0c;Oracle数据库包含SQL测试用例构建器&#xff0c;它可以自动完成收集和复制尽可能多的有关问题及其发生环境的信息的难…