2011-01-22 83 views
2

我正在寻找一种方法来管理跨多个数据源(包括但不限于数据库,某些网络控制工具以及其他基于SOAP的服务)的一系列更改。可撤消的更改集

如果某个更改由于某种原因失败(例如真实世界的应用程序显示“否”,或者数据库插入失败),我希望整个设置被撤消。这就像交易一样,不仅限于数据库。

我想出了一个模块,该模块堆叠“更改”对象,该对象又具有其init,commit和rollback方法。当该设备被破坏时,它会将未提交的更改回滚。这有点作品。

我仍然无法克服发明轮子的感觉。是否有一个标准的CPAN模块,或一个描述得很好的常见方法来执行这样的任务? (至少四人帮的“命令”模式和RAII原则浮现在脑海中......)

回答

2

有一对夫妇的方法来执行Distributed transaction(这是你描述):

  1. 的标准模式称为“Two-phase commit协议”。

    目前我还没有意识到任何实现两阶段提交的Perl模块,这有点令人惊讶,可能是由于我的谷歌搜索失败。我发现的唯一的东西是Env::Transaction,但我不知道它是多么稳定/好/功能。

  2. 对于某些情况,可以通过“Compensating transactions”回滚解决方案。

    这基本上是一种普遍回滚的特殊情况,其中当生成任务列表A时,设计为将目标系统状态从S1更改为S2,同时生成一个“补偿”任务列表A-neg,用于更改目标系统状态从S2回到S1。这显然只对某些系统是可能的,而且这些系统中只有一小部分是可交换的(意味着您可以同时执行交易和其补偿交易),例如A + B + A-neg + B-neg的结果是不变的状态。注意到补偿性交易并不总是必须设计成“交易” - 一种巧妙的方法(再次,只能在某些主题域上实现)涉及用特殊的“最终确定”标志存储数据;然后定期收集和销毁数据如果数据的“原始交易时间戳”比某种阈值更旧,则使用虚假的“最终确定”标记。

+0

感谢你的回复,我希望我能再次提升它)。原来我已经实施了补偿交易。 – Dallaylaen 2011-02-02 09:47:10