2011-06-27 70 views
0

我在开发系统时遇到了一些问题。我有一个python脚本,它首先与一个virtulisation软件一起工作,如果这个操作成功了,它将把事情写入数据库。 如果在虚拟化软件中发生了一些异常,我可以管理所有东西,但是如果在数据库中插入失败,则会出现真正的问题。如果插入失败,我将不得不在该虚拟化软件中还原事物,否则事情将变为异步。但问题是,在软件中恢复的东西是不可能的。数据库同步

如何处理事情,以便我可以保持数据库与该软件同步?任何中间件或特殊应用程序?或编程中的任何逻辑?

回答

1

您希望系统中的两个操作(OP:操作在您的virt软件中; WDB:写入数据库)为原子操作(两者都发生,或者都不发生)。一种分布式事务,但是您的虚拟化软件不直接支持可交易行为(不回滚)。如果你可以让它们成为一些分布式事务系统的一部分,你就完成了(见eg),但这通常是不可能或不切实际的。获得伪交易行为的不同策略取决于您的场景的具体情况。一些例子:


  1. 打开TX(DB中的交易)
  2. WDB
  3. OP
  4. 如果OP完成,提交TX,否则回滚TX。

只有写入数据库的内容不依赖于OP操作(不太可能)才可行。


  1. OP1(操作的第一阶段:你得到的结果,但不改变任何东西)
  2. 打开TX
  3. WDB
  4. OP2(第二阶段:您修改的virt。 sofware)
  5. 提交TX或回滚

(步骤4-5可切换)这将是一个口服或者是人的“两阶段提交”实现。只有在这两个阶段你才能分开你的手术。


  1. 打开TX
  2. 假人WDB(写入虚设结果DB)
  3. 回滚TX
  4. OP
  5. WDB

这会检查DB是可操作,在尝试真正的操作和写作之前做一个虚拟的写作。可行,但不是万无一失。


  1. OP
  2. WDB
  3. 如果失败:将数据保存到原始文件,日志错误,发送邮件到IT,就变成红灯。

声音可怜......但有时这是唯一可行的办法。

+0

不错的答案..我会选择倒数第二.. – adityap