mysql 共享锁_mysql有排他锁为什么还需要共享锁呢?

两把锁缺一不可,InnoDB 引擎中的四种隔离级别就是用 排他锁 + 共享锁 实现的。

下面是个人理解,可能并不严谨。

首先说一下并发可能产生的四种问题,如果你还不了解这四个问题,最好拿至少 20 分钟时间模拟一下场景。

假设有两个事务A,B,有一个资源值(一条记录)是V;另外一个资源值(多条记录的集合) VVV。

1.丢失修改:A 修改 V 为 v1, B 修改 V 为 v2。那么最后 V 是v1 还是 v2 呢?无论结果是什么,一定只有一个结果,那么另外一个修改就丢失了,因此叫做丢失修改。

2.脏读:A 修改 V 为 v1, 但是修改不成功,事务会回滚。 在事务 A 回滚的时候,B去读取 V 的值,读到的值是什么? 是 v1。 我们的 B 事务想期望的值是 V, 但是却读到了 v1,v1是一个脏数据,因此我们简称脏读。

3.不可重复读:这个场景下,A 事务要读两次 V 的值。 第一次直接读取,然后停下,这个时候 B 事务去修改 V 的值为 v1,然后 A 事务再执行它的第二次读取。第一次读到的是 V, 第二次读到的是 v1,一个事务不同时间读到的值不一样,这个就是不可重复读。

4.幻读:这个场景的资源值不再是一个记录了,而是很多记录的一个集合,我们叫它 VVV(假设有三条记录,分别为 v1,v2,v3)。A 事务读到了 VVV 集合,再使用它之前,B 事务把集合中的 v3 值删除了,这个时候我们去使用这个集合中的 v3, 但是发现值不在这里了,我们所读到的集合就是一个不真实的集合。幻读的资源一定要是一个集合,修改(删除也被认为是一种修改)会导致集合变化。

针对这四种问题,MySQL有四种不同的隔离级别,不同的隔离级别解决的问题不一样。

1.读未提交:解决丢失修改的问题。由上面可知,两个事务同时修改一个资源值的时候,会发生修改丢失的问题。这个时候我们对资源加一个排他锁,加锁以后,资源只能由一个事务所拥有,修改完毕以后另外一个事务才可以拿到资源。这就解决了丢失修改的问题。(资源值加 X 锁,事务结束释放)。

2.读提交:解决脏读问题。在 1 的基础上(给资源加 X 锁,直到事务结束),增加一个 S 锁。 读数据的时候给数据加一个 S 锁, 资源在有 X 锁的时候,S 锁是加不上去的,因此直到事务结束, S 锁才可以加上去, 事务都结束了,自然不会读到脏数据。(写数据加 X 锁,事务结束释放,读数据加 S 锁,读完数据立即释放)

3.可重复读:上一个隔离级别中,读的时候加 S 锁。 在不可重复读的问题里面:

a.第一次读,加 S 锁,得到 V,释放 S 锁;

b. 然后 B 事务修改 V 为 v1,加了 X 锁,事务结束后释放;

c.第二次读,加 S 锁,得到 v1,释放 S 锁。

是不是不可重复的问题还是存在?怎么解决呢? 将我们的 S 锁设定为,一个事务结束后才释放。 加了这个限定条件以后, B 事务就无法修改 V, 因为 V 现在加了 S 锁,只能被读,无法被修改。(写数据加 X 锁,事务结束释放,读数据加 S 锁,事务结束释放)

4.串行化,串行化是事务完全按照 ACID 的四个原则来执行,这种情况效率比较低,很少用。

这样一说了,你觉得共享锁还是多余的吗?

各位姥爷,能理解的点个赞啊。

再针对具体问题做一个解释。

select *from table_name for update; // 加 X 锁

select *from table_name for share; // 加 S 锁,MySQL 版本 8.0 以后。

select *from table_name lock in share mode; 加 S 锁, MySQL 版本 8.0 以前。

示例: 1. 首先开始一个事务A,并且关闭自动提交。

START TRANSACTION;

set autocommit = 0;

2. 然后在查询条件下加一把 X 锁

SELECT*FROM table_name for UPDATE;

3. 接下来你再开一个查询窗口,开不开事务都没关系,给查询加一把 S 锁

SELECT *FROM person LOCK IN SHARE MODE; // 我的版本是 MySQL 5.6

执行这条查询 SQL 的时候,就会被堵塞。原因是你在 事务A 中给表加了 X 锁,再给表加 S 锁的时候就会堵塞。

当然,你可以先加 S 锁,再去加 X 锁的时候同样会被堵塞。

希望看明白了可以点个赞。

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

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

相关文章

xpress-mp优化实例精选_量化研究每周精选-20170711

本周为大家精选了5项机器学习/深度学习在量化投资中的相关资源,机器学习/深度学习是偏实践性学科,只有不断实践才能有所收获,纸上得来终觉浅,绝知此事要躬行!BigQuant拥有海量的数据和主流开源框架,附能每一…

mac 删除分区 command r 选择网络_Mac使用必看基础篇,Mac快捷键大全,mac新手入门指南...

你是Mac新手吗?你对使用Mac电脑有疑问吗?你还不知道mac有哪些快捷键吗?别着急,来看看小编给大家准备的Mac使用必看基础篇——Mac快捷键大全,对于新手用户很有帮助哦!!一、开机相关命令快捷键C:从…

不同版本的mysql_windows下如何让多个个不同版本的mysql共存-百度经验

第十步,在解压目录下,编写mysql的配置文件my.ini,注意basedir,datadir,与自己的解压目录是一致的---------------------------------------------[mysqld]# 设置3307端口port3307# 设置mysql的安装目录basedirC:\\mysql8# 设置mysql数据库的数…

mysql have_mysql having的用法

having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。我的理解就是真实表中没有此数据,这些数据是通过一些函数生存。SQL实例&#xff1a…

无法执行二进制文件: 可执行文件格式错误_VB中.frm .frx .vbp .vbw .scc文件都有什么作用,你知道么?...

.frm 是每个窗体都有的,保存窗体的代码,你可以用记事本打开;.frx 窗体里使用图片、图标等资料,保存的是资源;.vbp 和.vbw 保存一个工程时他会自动生成这两个文件。.vbp 是关键的文件,它用来保存当前工程中的…

共享文件原理_fishhook 的实现原理浅析

| 作者:小可长江,目前在 bilibili 做音视频研发,业余时间喜欢研究好的源码和逆向打开姿势很重要早些时候,iOS中一提到“黑魔法”、HOOK,很多人第一时间想到的就是 AOP RunTime MethodSwizzling 这些不明觉厉的东西&…

ef power tools mysql_使用 EF Power Tool Code Frist 生成 Mysql 实体

使用 EF Power Tool Code Frist 生成 Mysql 实体1,在要生成的项目上右键2,3,4,5, 生成后的效果已知问题:1,在Mysql数据表中 tinyint(1) ,会被映射成为 C# bool ,这样造成一些数据信息的丢失。 这个问题应该是EF 工具的问题&#…

python数据可视化散点图案例_Python数据可视化—散点图_python 数据可视化

Python数据可视化—散点图 PS: 翻了翻草稿箱, 发现居然存了一篇去年2月的文章。。。虽然naive,还是发出来吧。。。 本文记录了Python中的数据可视化——散点图scatter, 令x作为数据(50个点,每个30维)&#…

redis解决mysql主从延迟_mysql主从同步延迟问题解决方法

mysql主从同步延迟问题解决方法:在从服务器上执行show slave status;可以查看到很多同步的参数,我们需要特别注意的参数如下:Master_Log_File: SLAVE中的I/O线程当前正在读取的主服务器二进制日志文件的名称…

python重复元素判定_30段极简Python代码:这些小技巧你都Get了么

选自 | towardsdatascience转自 | 机器之心Python 是机器学习最广泛采用的编程语言,它最重要的优势在于编程的易用性。如果读者对基本的 Python 语法已经有一些了解,那么这篇文章可能会给你一些启发。作者简单概览了 30 段代码,它们都是平常非…

mysql主从数据库同步问题_聊聊MySQL主从数据库同步的那些事儿

在linux服务器下测试:主(master)服务器IP:219.223.5.105(对应内网IP:192.168.1.75)从(slave)服务器IP:219.223.5.104(对应内网IP:192.168.1.74)一、修改主服务器master[mysqld]log-binmysql-bin //[必须]启用二进制日…

360浏览器广告太多怎么办_360浏览器如何关闭广告自动推送

点击蓝字关注我们大家是不是在用360浏览器上网的时候经常会跳出广告来,这些广告有些时候是很烦人的,然而这些广告是能够关闭的,现在我们针对360浏览器,介绍如果关闭自动推送的广告。首先在360浏览器的右上方找到三条杠的“大队长”…

linux下php支持mysql_linux下php扩展mysqli的支持 .

mysqli是优化后的mysql,具体的优点baidu下就ok了cd php-5.2.8 在这下面有个ext文件夹里有mysqlicd ext/mysqlilinux下将源码文件编译应该都有configure吧,可这里没有,在我们已经安装php后,php5这个文件夹里的命令目录bin里有一个…

代码合并工具_作为程序员你必须知道的几款代码比较工具

在程序开发的过程中,程序员会经常对源代码以及库文件进行代码对比,在这篇文章里我们向大家介绍几款程序员常用的代码比较工具。WinMergeWinMerge是一款运行于Windows系统下的文件比较和合并工具,使用它可以非常方便地比较多个文档内容&#x…

mysql 修改数据库的数据库_如何更改MySQL数据库的数据库名

展开全部被取消的命令MySQL 之前提供了一个 rename database db_old to db_new 的命令来直接对数据库改名,可能由于实现的功能不完备(比62616964757a686964616fe58685e5aeb931333433653931如,这条命令可能是一个超大的事务,或者是由于之前的表…

powershell设置了权限依旧无法运行脚本_Power Shell折腾记

更多内容可以关注公众号“编程学习杂谈(codingLearning)”或者访问我的博客微软昨天刚刚发布了最新的Terminal图标,对是图标不是软件。对这个最新版的终端个人期待值还是很高的,不仅颜值高而且更好用,不过正式在稳定Wi…

mysql错误回显注入_基于错误回显的SQL注入整理

由于复习,停了好几天,今天换换模式做了一下关于错误回显的ctf题目,首先附上题目:here整理了一下网上的一些关于错误回显的方法,在这里就不带上地址了,请大牛们原谅:P0x00 关于错误回显用我自己的…

delphi中richedit中光标如何定位到最后_嵌入式开发之Linux系统中Vi编辑器的使用

请大家关注点赞&#xff0c;已经完成物联网相关开发&#xff0c;会从硬件层&#xff0c;硬件中间层&#xff0c;传输层&#xff0c;软件中间件(物联网云平台)&#xff0c;APP开发相关博文。首先从嵌入式开发博文开始&#xff01;上一节关于<>。本节关于Linux系统中Vi编辑…

什么是python自动化测试_python已经自动化了,大家一般用什么测试框架?

首先我们需要明白自动化测试框架更倾向于一种设计思想 &#xff0c;这种思想指导工具的使用或者自研开发&#xff0c;并且不是只能使用仅仅一种框架&#xff0c;结合被测系统本身特性一般是选择多种测试框架的组合&#xff0c;来满足测试和设计需求(开发、维护角度)。录制回放测…

nginx会将post请求转为get么_前端角度谈GET与POST的区别

GET与POST 参数&#xff1a;GET传递的参数只能带URL后面&#xff0c;文本格式QueryString&#xff0c;各浏览器一般有长度限制&#xff0c;一般认为是2083&#xff0c;如果有中文字符更短。提交到服务器端的数据量小。参考&#xff1a;https://www.XXX.com.cn/blog/20201021.ht…