MySQL 的事务与 MVCC

mysql cooljun 62℃ 0评论

1.事务的4个特性
ACID:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)
注:事务主要实现的是一致性,主要通过原子性,隔离性、和持久性来达到一致性的目的

2.mvcc
mvcc:Multi-Version Concurrency Control(多版本并发控制)
简述:指每条记录都会有多个版本,每次修改记录都会存储这条记录被修改之前的版本,多版本之间串联起来就形成一个版本链,这样可以在事务启动时可以无锁的获得不同版本的数据,此时读写操作不会阻塞。历史版本可以供已启动的事务读取

3.事务的隔离级别
读未提交、读已提交、可重复读、串行化
mvcc主要是实现(读已提交,可重复读)

4.mvcc的作用
如果没有 MVCC 读写操作之间就会冲突。想象一下有一个事务 1 正在执行,此时一个事务 2 修改了记录 A,还未提交,此时事务 1 要读取记录 A,因为事务 2 还未提交,所以事务 1 无法读取最新的记录 A,不然就是发生脏读的情况,所以应该读记录 A 被事务 2 修改之前的数据,但是记录 A 已经被事务 2 改了呀,所以事务 1 咋办?只能用锁阻塞等待事务 2 的提交,这种实现叫 LBCC(Lock-Based Concurrent Control)。
如果有多版本的话,就不一样了。事务 2 修改的记录 A,还未提交,但是记录 A 被修改之前的版本还在,此时事务 1 就可以读取之前的版本数据,这样读写之间就不会阻塞啦,所以说 MVCC 提高了事务的并发度,提升数据库的性能。

5.mvcc实现原理
mvcc其实是通过undolog来获取历史版本的数据。存入的记录会生成2个隐藏字段trx_id(当前事务id),roll_pointer(指向undolog的指针),

6.readView
readView:用来判断哪个版本对当前事务可见的,这里有四个概念:
creator_trx_id,当前事务 ID。
m_ids,生成 readView 时还活跃的事务 ID 集合,也就是已经启动但是还未提交的事务 ID 列表。
min_trx_id,当前活跃 ID 之中的最小值。
max_trx_id,生成 readView 时 InnoDB 将分配给下一个事务的 ID 的值(事务 ID 是递增分配的,越后面申请的事务 ID 越大)
判断条件如下:
如果当前数据版本的 trx_id == creator_trx_id 说明修改这条数据的事务就是当前事务,所以可见。
如果当前数据版本的 trx_id < min_trx_id,说明修改这条数据的事务在当前事务生成 readView 的时候已提交,所以可见。
如果当前数据版本的 trx_id 在 m_ids 中,说明修改这条数据的事务此时还未提交,所以不可见。
如果当前数据版本的 trx_id >= max_trx_id,说明修改这条数据的事务在当前事务生成 readView 的时候还未启动,所以不可见(结合事务 ID 递增来看)。

转载请注明:cooljun小站 » MySQL 的事务与 MVCC

如果你觉得这篇文章对你有帮助,请支持我继续更新网站 !捐赠本站
喜欢 (0)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址