MVCC是如何实现的?
MVCC是如何实现的?
提示
题眼: 类似乐观锁,无锁并发。
相关信息
等价于:MySQL是如何实现可重复读的?可重复读级别的原理有了解过么?
MVCC又叫基于版本号的多版本并发控制,主要解决隔离性的问题;mvcc工作在读已提交和可重复读的隔离级别下,两者最大的不同是创建read view的时机不同,采用read view和undo log版本链解决,undo log是事务链表,记录有(事务)trx_i和rool_pointer(指针),在read view 读视图中有min_trx_id(最小事务id)、max_trx_id(最大事务id)、create_trx_id(创建事务id)和m_trx_id(活跃事务id);工作原理是查看当前事务是否在当前read view中,如果在,会寻找上一个版本的事务id,如果不在,该事务就是查找的事务。
重要
参考答案:
MVCC是一种基于版本号的多版本并发控制,它的原理有点类似与乐观锁,它主要用在读已提交和可重复读的级别下,主要用来解决脏读和可重复读问题。它主要有两个部分,一个是read view, 一个是undolog。read view会记录当前数据的版本情况,和同时并发的事务的一些信息,undolog是一个事务链表,它记录每一个事务操作的一些情况。在可重复度的级别下,它会记录一行数据的多个版本情况,事务只能看到自己相关,看不到别人的这样彼此之间不会出现冲突。如果我们操作了某些数据,最后没有提交需要回滚,它就会通过undolog找到最初的版本,将数据回滚掉。然后,MVCC会配合这当前读和快照读一起工作,当我们开事务的时候,只是快照读,各个事务之间不会冲突,也不加锁,只有当我们写操作时会升级到当前读,这个时候才会对需要的数据进行加锁。
