MySQL-多版本并发控制

一、概念

mvcc通过数据行的多个版本管理来实现数据库的并发控制。这项技术使innoDB的事务隔离级别下执行一致性读操作有了保证。就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。

二、快照读与当前读

mvcc在MySQL InnoDB中实现主要是为了提高数据库的并发性能,更好的去处理读-写冲突,做到即使有读写冲突也可以不加锁,非阻塞性并发读,这个读是指快照读,不是当前读。当前读实际上是一种加锁操作,悲观锁的实现,mvcc本质是采用乐观锁思想的实现。

1、快照读(一致性读)

读取的是快照数据,不加锁的简单的select都属于快照读,可能并不是最新的数据,可能是历史版本,前提是隔离级别不是串行级别的,串行级别下的快照读可能会退化成当前读。

2、当前读

读取的是当前版本,读取时需要加锁保证某一个事务下数据不会被其他事务所修改。

三、MVCC实现原理之ReadView

1、什么是ReadView

事务用来查询存在undo log里的历史快照,提供行的可见性,innodb为每个事务构造一个数组,用来记录并维护系统当前活跃事务的ID(启动但还未提交)

2、设计思路

  • 使用 READ UNCOMMITED隔离级别事务,可以读到未提交事务,所以使用不上MVCC,所以读取的是最新数据而不需要读取历史数据;
  • 使用 SERIALIZABLE隔离级别的事务,innodb规定使用加锁的方式来访问记录;
  • 使用READ COMMITTED和REPEATABLE READ隔离级别的事务,必须保证读到已经提交的事务修改过的记录。加入另一个事务已经修改了记录但是尚未提交,是不能直接读取最新版本的记录的,核心问题就是需要判断一下版本链中的哪个版本是当前事务可见的,这是ReadView要解决的主要问题。
  • cread_trx_id:创建这个read view的事务id;
  • trx_ids:表示在生成read view时当前系统中活跃的读写事务的事务id列表;
  • up_limit_id:活跃的事务中最小的事务id;
  • low_limit_id:表示生成read view时系统中应该分配给下一个事务的id值。是系统最大的事务id。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值