mysql(InnoDB)事务隔离级别(REPEATABLE READ) 与 锁,MVCC
REPEATABLE READ
(可重复读)
-
之前已经了解到, 该隔离级别可以解决
不可重复读问题
(当然, 也能解决脏读问题
), 那么如果单纯用锁来实现, 可能会是如下这样子:- 既然
REPEATABLE READ
隔离级别可以解决脏读
,不可重复读
的问题, 也就是它既可以让事务只能读其他事务已提交的的记录, 又能在同一事务中保证多次读取的数据即使被其他事务修改, 也是一致的。 - 解决
脏读问题
:
试想一下, 当在事务A中读取数据D的时候, 假设D之前已经在事务B中了, 并且事务B中对数据D做了修改, 但是事务B还没有完成(commit/rollback), 那如何让事务A无法读取数据D呢?
当事务B在对数据D做写操作的时候, 假设给数据D加上了行级的排他锁(X lock), 那事务A自然只能阻塞等事务A完成后才能读取数据D了, 这样就解决了脏读问题
。 - 解决
不可重复读问题
:
试想一下, 当在事务A中第一次读取了数据D之后, 直接给该数据D加S共享锁, 那其他事务自然只能阻塞等事务A完成后才能对数据D做修改操作了, 这样就解决了不可重复读
, 在事务A中多次读取数据D, 都是一样的。
- 既然
上面使用
S锁+X锁
确实可以实现READ COMMITTED
隔离级别的效果, 也就避免了脏读问题
和不可重复读问题
, 当然, 这里的问题仍然是低效!!!!-
因为 MySQL 在事务隔离级别Read committed 、Repeatable Read下,InnoDB 存储引擎采用
非锁定
的一致性读
--即读取数据不用加锁,即采用的是MVCC中一致性非锁定读
模式, 所以, InnoDB的做法是: 读不影响写,写不影响读。- 读不影响写: 当数据正在执行读操作时,其他事务的写操作不会因此去等待当前事务行上S锁的释放,而是会去读取行的一个快照数据。
- 写不影响读:当数据正在执行写操作时,其他事务的读操作不会因此去等待当前事务行上X锁的释放,而是会去读取行的一个快照数据。
- 所以总结来看,
READ UNCOMMITTED
和REPEATABLE READ
这两个隔离级别都是使用写用排他锁 + 读用MVCC
, 区别可以参考 MySQL-InnoDB-MVCC多版本并发控制
编程空间
欢迎大家交流学习, 有帮助的不要忘记 点赞 和 收藏!
推荐阅读
彻底搞清 同步,异步,阻塞,非阻塞的概念性知识
之前反正一直搞不清楚同步和阻塞, 异步和非阻塞的概念, 总感觉同步就是阻塞, 异步就是非阻塞的, 总是搞得晕乎乎的, 于是就重新查了些资料进行了梳理, 如有不对欢迎大家指正;
@赞 13阅读 8.1k评论 7
万字长文~vue+express+mysql带你彻底搞懂项目中的权限控制(附所有源码)
所谓的权限,其实指的就是:用户是否能看到,以及是否允许其对数据进行增删改查的操作,因为现在开发项目的主流方式是前后端分离,所以整个项目的权限是后端权限控制搭配前端权限控制共同实现的
水冗水孚赞 11阅读 1.5k
花了几个月时间把 MySQL 重新巩固了一遍,梳理了一篇几万字 “超硬核” 的保姆式学习教程!(持续更新中~)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
民工哥赞 11阅读 1k
一次偶然机会发现的MySQL“负优化”
今天要讲的这件事和上述的两个sql有关,是数年前遇到的一个关于MySQL查询性能的问题。主要是最近刷到了一些关于MySQL查询性能的文章,大部分文章中讲到的都只是一些常见的索引失效场合,于是我回想起了当初被那个...
骑牛上青山赞 8阅读 2.2k评论 2
Mysql索引覆盖
通常情况下,我们创建索引的时候只关注where条件,不过这只是索引优化的一个方向。优秀的索引设计应该纵观整个查询,而不仅仅是where条件部分,还应该关注查询所包含的列。索引确实是一种高效的查找数据方式,但...
京东云开发者赞 2阅读 932
2023最新MySQL高频面试题汇总
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~
程序员大彬赞 3阅读 972
Mysql 数据库的批量插入或更新(Upsert)
这个问题已经困扰我一段时间了,对于大量数据的插入或更新,批量操作肯定比每条记录调用一次快得多,新数据可以用 insert 批量插入,老数据可以用 replace into 批量更新。但如果不知道数据是否存在(是否有唯一k...
songofhawk赞 2阅读 2.4k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。