Mysql的MVCC

1、MVCC是什么

        多版本并发控制,通过数据行的多个版本管理来实现数据库的并发控制。A事务查询一些正在被B事务更新的行,可以看到它们被更新之前的值,这样在做查询的时候就不用等待B事务释放锁。

2、MVCC实现原理

隐藏字段
Undo Log:
回滚日志
Read View:MVCC机制进行快照读操作产生的读试图

3、Read View的规则

自己修改的记录总是可见
        如果数据库记录的trx_id(修改它的事务ID)与当前事务的creator_trx_id相同,这意味着你在看自己改过的东西。既然这是你自己改的,自然就可以看,没有任何限制。
已提交事务的更改可见
        如果记录的trx_id小于up_limit_id,这表示改这个记录的事务在你创建查看视角(ReadView)之前就已经完成了(提交了)。因为那个事务已经结束且成功了,它留下的数据对你来说就是可见的。
未来事务的更改不可见
        如果记录的trx_id大于或等于low_limit_id,意味着这个改动发生在你创建查看视角之后。因为这个事务开始于你查看的那一刻之后,它的改变就像是未来的风声,你现在还听不到,所以这些改变对你不可见。
正在进行的事务需特殊判断
        当记录的trx_id介于up_limit_id和low_limit_id之间时,这代表那个事务在你创建ReadView的时候还没完成。这时候,我们得查一下一个特殊的列表trx_ids,里面记录了所有当时还在进行的事务ID。如果这个trx_id在列表里,说明那个事务当时还没结束,它的改动对你来说还是未知数,因此不可见。如果不在列表里,那说明虽然它开始于你看之前,但在你看的时候它已经悄悄提交了,所以这些改动你可以看到。
总结一下,就是自己改的随便看,别人改完的也能看,未来的事看不到,至于那些改了一半的,得看他们最后到底成没成

4、MVCC整体操作流程

  1. 启动事务并记录ID:当你开始一个新的数据库事务时,系统会自动分配一个唯一的事务ID(Transaction ID)给你这个事务。
  2. 构建事务视图:事务开始时,系统会创建一个“快照”或者说一个ReadView,这个ReadView记录了当前活跃事务的列表以及一个关键时间点,用于后续判断数据可见性。
  3. 查询数据并筛选版本:当你的事务尝试读取某条记录时,数据库不仅查找匹配的记录,还会检查这些记录的事务ID,依据ReadView的规则来决定哪些版本的数据对你可见。               
  4. 利用Undo Log还原历史数据:如果直接查询到的数据因不符合ReadView规则而不可见,数据库会追溯至Undo Log,这是一种历史记录,用来存储事务修改前的数据状态。通过Undo Log,系统能够重建一个符合你事务视图要求的、过去某个状态的数据版本。
  5. 返回合适版本的数据:经过上述步骤,数据库最终确定并返回一个既符合你查询条件又遵循MVCC规则的数据版本。这样,即使有其他并发事务在操作数据库,每个事务看到的数据都是逻辑上一致的,仿佛其他事务不存在一样。

5、隔离级别下生成Read View的次数

读已提交(Read Committed):每次查询前刷新ReadView:在这种隔离级别下,事务中的每个SELECT查询开始前,都会创建一个新的ReadView。这意味着每次查询看到的是在查询时刻已经提交的最新数据。因此,在同一个事务内连续执行两次相同的查询,可能会得到不同的结果,因为在这两次查询之间可能有其他事务提交了修改。
可重复读(Repeatable Read):单次生成持久使用ReadView:在事务开始时,仅生成一次ReadView,并在整个事务期间重复使用这个视图。这意味着在事务执行过程中,即使其他事务提交了对数据的修改,正在进行的事务看到的还是它开始时的数据状态,确保了同一查询在事务内多次执行结果的一致性。

6、解决的问题

读写之间的阻塞问题:在MVCC模式下,读操作通常不会加锁(除非是特定的锁如悲观读锁),而是通过ReadView机制查看数据的历史版本。这意味着读操作不会阻塞写操作,因为写操作可以自由地修改数据并生成新的版本,而读操作查看的是修改前的版本。同样,写操作也不会等待正在执行的读操作完成,因为它们操作的是不同版本的数据,这大大减少了读写之间的直接阻塞。
降低死锁概率:由于MVCC减少了事务间的直接锁竞争(尤其是读操作不再需要等待写锁释放),这自然降低了产生死锁的可能性。死锁通常发生在两个或多个事务互相等待对方持有的锁资源释放的情况。在MVCC模式下,读事务不阻塞写事务,写事务之间的锁等待也更加明确和有限,因此系统整体上更不容易陷入死锁状态。
解决快照读的问题快照隔离,在可重复读(Repeatable Read)隔离级别下,MVCC通过为每个事务提供一个数据的快照视图(即ReadView),确保事务内多次读取同一数据时结果一致,即使其他事务已经修改并提交了这些数据。

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值