提问者:小点点

混合最终一致性系统和遗留ACID系统


是否有将最终一致性系统与遗留ACID系统混合的模式?

我想将数据存储在大型机上一些(至少两个)需要类似ACID事务的遗留系统中。这些大型机数据库(让我们称之为OldWorld)在同一进程中的同一事务管理器下运行,因此大型机系统的一致性没有问题。

我有一个事务管理器,可以在非大型机环境(让我们称之为NewWorld)中处理带有大型机-tm和可ACID的关系数据库的XA-Transaction。但是我不想使用XA-Transaction,因为它经常会导致大型机端长时间运行锁的问题,并且在许多情况下我不需要两个世界的所有ACID-Feature。我总是想要一个一致的大型机(旧世界中的所有数据在旧世界中是一致的)。当NewWorld系统从大型机端读取数据时,它可以处理不一致的数据(新旧不一致)。用于在OldWorld存储数据的操作很简单,并且保存了不能在功能上失败的“仅添加操作”(它在技术上可能会失败,但这应该始终是暂时失败)。


共1个答案

匿名用户

我解决分布式事务需求的想法是,我异步更新旧世界中的数据,并使用事件源数据层(在新世界中)来存储旧世界中需要做的信息,使用“软事务ID”来防止重复提交给旧世界。这些“软事务ID”将在将数据存储到事件源数据层时生成,用于需要在旧世界中完成的事务。

我没有将我的“软事务ID”添加到旧世界数据库的更改,但我可以添加一个新的数据库,该数据库可以在“软事务ID”旁边存储“完成”状态,并使该数据库的更新成为旧世界事务的一部分。然后另一个异步进程可以在没有任何锁定的情况下读取状态信息并更新NewWorld(例如。使用来自事件源存储的数据更新关系模型。并将软事务ID标记为已完成(“全局一致”))旧世界的更新将始终检查软事务ID是否总是首先提交。

当我通读我的文章时,我感觉它就像全局事务,只是锁定较少。我对旧世界的更新将成功运行的知识是必不可少的,否则你需要一个手动合并过程来处理功能冲突。新世界系统需要处理不一致的全局状态的功能。它可以通过读取关系数据库来完成,并通过分析尚未提交(到旧世界数据库)的事件存储来模仿旧系统数据请求。对于所有其他事务,我需要使用分布式事务及其锁定行为。