MySQL怎么开启MVCC_mysql的MVCC

本文介绍了MySQL中的多版本并发控制(MVCC)机制,用于在RR和RC隔离级别下实现数据的隔离性。MVCC通过undo log实现,每行记录包含DB_TRX_ID和DB_ROLL_PT两个隐藏版本号。在RR隔离级别下,快照读避免了脏读,但可能出现幻读。文章通过实例展示了MVCC的工作过程,并探讨了幻读的产生以及如何通过当前读和特定锁机制来解决幻读问题。
摘要由CSDN通过智能技术生成

张喜硕学长以前讲过一篇MySQL RR 与 锁,在本周又看到了RR的问题,里面提到了RR是通过MVCC实现的,但是自己对此却没什么印象,翻了翻学长的博客也没讲过,就学习一下,做个记录。

MVCC

MVCC 即多版本并发控制技术,简单的理解就是一份数据保存了多份。

用于多事务环境下,对数据读写在不加读写锁的情况下实现互不干扰,从而实现数据库的隔离性,在事务隔离级别为Read Commit 和 Repeatable read中使用到。

在InnoDB中,MVCC其实是通过undo log来实现的,但使用undo log解释起来较为复杂,所以普遍的解释是:每行记录的后面保存了两个隐藏的列,DB_TRX_ID(数据行的版本号)和DB_ROLL_PT(删除版本号),这两列保存的是系统版本号,每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。下面看看进行不同的操作时(以下内容取RR隔离级别,当然RC也是同理,只不过select的选定范围不同),InnoDB的行为:

SELECT

InnoDB会根据以下两个条件检查每行记录:

InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。

行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除。

INSERT

InnoDB为新插入的每一行保存当前系统版本号作为数据行版本号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值