mysql MVCC

“为什么我觉得你会变魔术啊?”“不会啊!”“真的不会吗?那你怎么越变越好看了”

 

什么是MVCC?

MVCC (Multi-Version Concurrency Control) 多版本并发控制方法

(注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。

  MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在事务级别提交读可重复读有效。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。

  可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低。都是为了实现了非阻塞的读操作,写操作也只锁定必要的行。

 

为什么MVCC只在提交读和可重复读事务级别下有效呢?

MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个隔离级别下工作。其他两个隔离级别和MVCC不兼容,

READ UNCOMMITTED:总是读取最新的数据行,而不是符合当前事务版本的数据行。
SERIALIZABLE 则会对所有读取的行都加锁。

 

MVCC 在 MySQL 中实现所依赖的手段主要是: 隐藏字段、read view、undo log。 

  • undo log : undo log 用于记录某行数据的多个版本的数据。
  • read view 和 隐藏字段 : 用来判断当前版本数据的可见性。

 

MVCC 实现机制?

InnoDB在每行数据都增加三个隐藏字段,一个唯一行号,一个记录创建的版本号,一个记录回滚的版本号。

在多版本并发控制中,为了保证数据操作在多线程过程中,保证事务隔离的机制,降低锁竞争的压力,保证较高的并发量。在每开启一个事务时,会生成一个事务的版本号,被操作的数据会生成一条新的数据行(临时),但是在提交前对其他事务是不可见的,对于数据的更新(包括增删改)操作成功,会将这个版本号更新到数据的行中,事务提交成功,将新的版本号更新到此数据行中,这样保证了每个事务操作的数据,都是互不影响的,也不存在锁的问题。

 

posted @ 2022-07-06 09:08  方达达  阅读(6)  评论(0编辑  收藏  举报