赞
踩
MVCC,多版本的并发控制,Multi-Version Concurrency Control
undo日志:
例子:表中本来有记录(1,张三,一班)
事务10更新记录:(1,李四,一班)后又更新(1,王五,一班)
事务20更新记录:(1,钱七,一班)又更新(1,宋八,一班)
此时记录修改了四次,undo日志形成版本链:
隐藏字段:
每行记录后面保存两个隐藏的列:一个保存了行的事务ID(TRX_ID),一个保存了行的回滚指针(ROLL_POINTER)
ReadView:
RU(READ UNCOMMITTED) 不处理,所有事务直接读取数据库的最新值即可。SERIALIZABLE 隔离级别对所有操作加锁。
RC(READ COMMITTED) 和 RR(REPEATABLE READ) 隔离级别的实现是通过版本控制来完成。两种隔离界别下的核心处理逻辑就是通过ReadView判断所有版本中哪个版本是当前事务可见的处理。
ReadView中主要包含当前系统中还有哪些活跃的读写事务,把它们的事务id放到一个列表中,我们把这个列表命名为为m_ids。
- 使用READ COMMITTED隔离级别的事务在每次查询开始时都会生成一个独立的 ReadView。
REPEATABLE READ 隔离级别的事务在第一次读取数据时生成一个ReadView。
例子:
1、READ COMMITTED隔离级别(解决脏读)
2、REPEATABLE READ 隔离级别(解决不可重复读)
2、REPEATABLE READ 隔离级别(解决幻读)
比较:RC,RR级别下的InnoDB快照读有什么不同?
读已提交(RC):RC隔离级别下,每个快照读都会生成并获取最新的Read View,每次都读取undo log中最近的版本,因此两次对同一字段的读可能读到不同的数据(不可重复读),但能保证每次都读到最新的数据。可重复读(RR):在RR隔离级别下,则是同一个事务中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。每次都读取undo log指定的版本,这样保证不会产生幻读,但可能读不到最新的数据。
总结:(MVCC机制原理)
MVCC机制的实现就是通过read-view机制与undo版本链比对机制,使得不同的事务会根据数据版本链对比规则读取同一条数据在版本链上的不同版本数据。MVCC使得数据库读不会对数据加锁,提高了数据库的并发处理能力。借助MVCC,数据库可以实现READ COMMITTED,REPEATABLE READ等隔离级别,用户可以查看当前数据的前一个或者前几个历史版本,保证了ACID中的I特性(隔离性)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。