网站首页 > 教程文章 正文
MVCC(多版本并发控制)和LBCC(基于锁的并发控制)都是常见的并发控制技术,可以通过不同的隔离级别来实现不同程度的数据一致性和性能需求。
通俗讲解下:
MVCC其实就是查询的时候,会去生成一个readView的class结构,里面会保存一些事务ID数据,比如当前存活的事务ID有哪些,然后跟数据的事务ID进行比对,来决定数据是否展示。
RR 只有在第一次查询的时候会生成一个readView,后面的查询比对的都是第一个查询的时候的结果,所以后面查不到新的值。
RC是每次查询都会生成一个新的readView,这样每次查询我就能拿到最新的数据了,也就产生了不可重复读跟幻读问题。
而LBCC是通过锁的形式去解决不可重复读跟幻读问题,就是我在改数据同一条或者同一批数据的时候,其他事务不能进行改动。但是RR相比于RC多了一个间隙锁,所谓间隙锁,就是会根据你锁的条件会锁定一个区间,所以没有幻读,但是RC隔离级别下,间隙锁只会用在重复键的检查。
下面我将根据两种隔离级别RR和RC来分别详细介绍MVCC和LBCC的工作原理和应用场景。
1、隔离级别为RR(可重复读) 在RR隔离级别下,事务可以读取已提交的数据,并保证在同一个事务中多次读取相同的数据结果都相同。具体来说,MVCC和LBCC的实现方式如下:
- MVCC:在MVCC中,每个事务开始时会拥有自己的快照视图,即只能看到它开始后已经提交的数据。因此,在RR隔离级别下,MVCC可以保证事务只能访问已提交的数据版本,并且在同一事务中多次读取相同的数据结果都相同。
- LBCC:在LBCC中,事务可以使用共享锁来读取已提交的数据,而写操作则需要使用排他锁。在RR隔离级别下,LBCC可以保证事务只能访问已提交的数据,并且在同一事务中多次读取相同的数据结果都相同。
2、隔离级别为RC(读已提交) 在RC隔离级别下,事务可以读取其他已提交的事务所修改的数据,并保证在同一个事务中多次读取相同的数据结果都相同。具体来说,MVCC和LBCC的实现方式如下:
- MVCC:在MVCC中,每个事务开始时会拥有自己的快照视图,即只能看到它开始后已经提交的数据。因此,在RC隔离级别下,MVCC可以保证事务只能访问已提交的数据版本,并且在同一事务中多次读取相同的数据结果都相同。不同之处在于,其他事务提交的新数据版本可能会被当前事务所看到,从而可能导致数据的不一致性。
- LBCC:在LBCC中,事务可以使用共享锁来读取已提交的数据,而写操作则需要使用排他锁。在RC隔离级别下,LBCC可以保证事务只能访问已提交的数据,并且在同一事务中多次读取相同的数据结果都相同。不同之处在于,其他事务提交的新数据可能会被当前事务所读取,从而可能导致数据的不一致性。
总的来说,MVCC适用于读操作频繁、写操作相对较少的场景,而LBCC适用于读写操作频率相近或写操作频率较高的场景。隔离级别的选择应当综合考虑性能和数据一致性的要求,并根据具体的应用场景和需求进行调整。
- 上一篇: Java锁最全详解(独享锁+共享锁+公平锁+非公平锁+乐观锁+悲观锁)
- 下一篇:已经是最后一篇了
猜你喜欢
- 2025-07-01 Java锁最全详解(独享锁+共享锁+公平锁+非公平锁+乐观锁+悲观锁)
- 2025-07-01 美团面试:MySQL悲观锁是什么?谈谈底层实现原理?
- 2025-07-01 什么是悲观锁,什么是乐观锁,有什么区别
- 2025-07-01 MySQL进行行级锁的?一会next-key锁,一会间隙锁,一会记录锁?
- 2025-07-01 MySQL8行级锁(mysql如何加行级锁)
- 2025-07-01 二阶段提交的 prepare 阶段,binlog 和 InnoDB 各自会有哪些动作?
- 2025-07-01 看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法
- 2025-07-01 深入理解MySQL锁机制原理(mysql锁的作用)
- 2025-07-01 一文由浅入深带你完全掌握MySQL的锁机制原理与应用
- 2025-07-01 MySQL InnoDB的行锁模式及加锁方法
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)