暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

YaoBase基于MVCC的无锁化乐观并发机制

原创 YaoBase 2023-12-08
411

乐观并发机制是基于内存计算数据库解决锁代价的主流机制,但是现有的乐观并发控制存在一些问题,在某些具体场景下仍然存在锁冲突,写锁检测代价,读倾斜等问题,这些问题都会降低系统的性能。

YaoBase数据库采用了一种无锁化的乐观并发控制机制,用依赖图来记录事务之间的依赖关系,来解除数据库对锁的依赖性,提升了分布式事务处理的性能。下面举例说明YaoBase乐观并发控制的原理。

在MVCC+2PL并发协议中,多条事务在某段时间内对一条数据进行更新时,只能有一条事务会获取到该条数据的行锁,并实施更新操作,其他事务只能等待,或者超过等待时间后事务回滚。如果想要所有事务成功完成,只有降低事务的冲突率,如一次只有一条事务请求该行数据的写锁,多条事务串行执行,但是串行执行事务的并发度极低。如图1的案例,是一个由多个账户向某一个特定账户转钱的串行执行示例。且只有1转账成功了才能发起新的转账操作2,操作2成功后才能有操作3,依次类推。


图1 应用案例

如果采用原有MVCC加行锁的方式,我们假设集体账户数据为key=1行,所有个人账户对应的数据行为key=2,key=3,……,key=n+1行,每一次从个人账户Key=x向集体账户key=1转钱,都需要将集体账户key=1行数据进行加锁,挂未提交链,未提交链一次只能有一个数据,并且只有等事务完成提交,从未提交链转到已提交链后,行锁才能被释放,如图2所示。因此每次只能允许一个账户key=x向集体账户key=1转钱。事务只能一条一条执行,并发度很低,我们可以认为事务是串行执行的。

IMG_256

图2 两阶段锁下key=1行未提交挂链

乐观协议的思想是事务可读取未提交数据,但是对于读到的未提交数据都要记录依赖关系,我们将事务间的写写冲突通过依赖图来表示,并通过依赖图来了解并发冲突事务的冲突处理过程。依赖图相关结构如图3所示,依赖图用DisGraph表示,alltransList_保存所有的事务节点。每一个事务节点通过结构体TransContex表示,保存事务号transNum_和依赖该事务的事务号transList_,除此之外,为了更快的找到事务节点在依赖图中的位置,我们在事务管理器中维护事务号和事务号对于节点相关信息的映射关系,我们将其命名为transCtx_,每个更新节点上的事务节点可以由事务描述符transNum_唯一表示,且一个事务的内存在事务没有结束前不会被分配第二次,因此transCtx_可以让用户通过transNum_快速找到事务相关信息。由于依赖图是在事务将自己的更新写入每行数据的未提交链时根据未提交链的上的事务信息建立的,如果并发事务间更新的写集有交集,那么依赖图就不可避免。


图3 依赖图数据结构   

事务的冲突检测是利用依赖图进行的,所有读写事务的依赖关系是在事务写集数据修改的过程中建立的,因此,建立的依赖关系也是只针对于事务写集中的数据。事务提交前,需要验证本事务依赖的事务是否已经全部提交,只有这些事务全部提交,本事务才能进入提交阶段;否则事务只能一直等待,且不断发起验证请求,并延迟提交。如果验证时发现本事务依赖的事务中存在回滚的事务,为了保证事务读取的因果一致性,本事务必须回滚,回滚的事务会立刻进入提交阶段,不过执行的是回滚操作。

针对图1的应用案例,key=1行未提交链上可以同时写入多个事务的更新数据,我们可以认为事务是并发执行的,如图4为无锁乐观协议下内存数据节点并行挂链的示意图。明显看出,对于这种情况,大大提高了事务执行的并发度。


图4 无锁协议下key=1行未提交挂链

YaoBase的无锁乐观协议通过依赖图来保存事务间的依赖关系,摆脱了对两阶段锁的依赖,打破了原有事务处理流程,允许大量事务并发执行,从而增加了系统的吞吐量。

YAOBASE(尧)分布式数据库是一款自主研制具有独特的增量聚集系统架构的国产金融级NewSQL分布式关系型数据库软件,广泛应用于国民经济关键领域海量、高并发、复杂业务等应用场景。为用户提供高性能、高安全及高可控的数据库能力,为海量数据的安全性及自主可控性提供服务。

YAOBASE(尧)分布式数据库兼容 Oracle/DB2/MYSQL 等特性,具备卓越的水平扩展能力,特有的增量聚集架构能有效的控制分布式事务比例,大大程度上消弱这一关键约束,有效地保证整体性能。因此能更好的适应复杂业务场景,减少用户在迁移过程中对应用程序的改动,有效控制迁移成本、提升迁移效率、降低迁移风险。


公司官网:www.yaobase.com

最后修改时间:2023-12-08 15:26:11
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论