基于MVCC的分布式事务

实现分布式事务除了使用类似“两阶段提交协议等方式外,另一种简单高效的方式就是使用MVCC(Multi version Cocurrent Control ,多版本并发控制技术。

MVCC 技术最初也是在数据库系统中被提出,但这种思想并不局限于单机的分布式系统,在分布式系统中同样有效。

MVCC简介

顾名思义,MVCC 即多个不同版本的数据实现并发控制的技术,其基本思想是为每次事务生成一个新版本的数据,在读数据时选择不同版本的数据即可以实现对事务结果的完整性读取。

在使用 MVCC 时,每个事务都是基于一个已生效的基础版本进行更新,事务可以并行进行,从而可以产生一种图状结构。

例子

输入图片说明

基础数据的版本为 1 ,同时产生了两个事务:事务 A 与事务 B 。

这两个事务都各自对数据进行了一些本地修改(这些修改只有事务自己可见,不影响真正的数据),之后事务 A首先提交,生成数据版本 2 ;基于数据版本 2 ,又发起了事务 C ,事务 C 继续提交,生成了数据版本 3 ;

最后事务 B 提交,此时事务 B 的结果需要与事务 C 的结果合并,如果数据没有冲突,即事务B 没有修改事务 A 与事务 C 修改过的变量,那么事务 B 可以 提交,否则事务 B 提交失败。

思想

MVCC的流程过程非常类似于 SVN 等版本控制系统的流程,或者说 SVN 等版本控制系统就是使用的 MVCC 思想。

事务在基于基础数据版本做本地修改时,为了不影响真正的数据,通常有两种做法,

一是将基础数据版本中的数据完全拷贝出来再修改,SVN 即使用了这种方法, SVN check out 即是拷贝的过程;

二是每个事务中只记录更新操作,而不记录完整的数据,读取数据时再将更新操作应用到用基础版本的数据从而计算出结果,这个过程也类似 SVN 的增量提交。

分布式MVCC

分布式 MVCC 的重点不在于并发控制,而在于实现分布式事务。

这里首先给出一个简化的分布式事务的问题模型,之后对 MVCC 的讨论基于该问题展开。

假设在一个分布式系统中,更新操作以事务进行,每个事务包括若干个对不同节点的不同更新操作。

更新事务必须具有原子性,即事务中的所有更新操作要么同时在各个节点生效,要么都不生效。

假设不存在并发的事务,即上一个事务成功提交后才进行下一个事务。

实现方式

基于MVCC 的分布式事务的方法为:

为每个事务分配一个递增的事务编号,这个编号也代表了数据的版本号。

当事务在各个节点上执行时,各个节点只需记录更新操作及事务编号,当事务在各个节点都完成后,在全局元信息中记录本次事务的编号。

在读取数据时,先读取元信息中已成功的最大事务编号,再于各个节点上读取数据,只读取更新操作编号小于等于最后最大已成功提交事务编号的操作,并将这些操作应用到基础数据形成读取结果。

在新事务执行过程中,虽然更新操作已经逐步记录到各个节点,但只要全局元信息不修改,始终不会读到 没有生效的事务数据,从而实现了全局一致性。另外,由于数据具有多个版本,可以自然实现对历史版本数据的读取。

问题

上述方法的一个重要问题是,随着执行的事务越来越多,各个站点保存的更新操作会越来越多,读取数据时需要应用的更新操作也越来越多。

工程中可以对此周期性的启动合并操作,将历史上不再需要的版本合并为一个更新操作。

参考资料

《分布式系统原理》