0

我正在开发的系统有一些问题。我有一个 python 脚本,它首先与虚拟化软件一起使用,如果该操作成功,它会将内容写入数据库。如果虚拟化软件出现异常,我可以管理所有的东西,但如果插入数据库失败,真正的问题就会出现。如果插入失败,我将不得不恢复该虚拟化软件中的内容,否则事情将变得异步。但问题是,恢复该软件中的内容是不可能的。

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

4

1 回答 1

1

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


  1. 打开 TX(数据库中的交易)
  2. 世界开发银行
  3. OP
  4. 如果 OP 成功,则提交 TX,否则回滚 TX。

仅当您写入 DB 的内容不依赖于 OP 操作(不可能)时才可行。


  1. OP1(操作的第一阶段:你得到结果,但不要改变任何东西)
  2. 打开TX
  3. 世界开发银行
  4. OP2(第二阶段:你修改virt.software)
  5. 提交 TX 或回滚

(可以切换步骤 4-5)这将是一个穷人的“两阶段提交”实现。只有当您可以将您的操作分为这两个阶段时才可行。


  1. 打开TX
  2. 虚拟 WDB(将虚拟结果写入 DB)
  3. 回滚 TX
  4. OP
  5. 世界开发银行

这将检查数据库是否可操作,在尝试实际操作和写入之前进行虚拟写入。可行,但并非万无一失。


  1. OP
  2. 世界开发银行
  3. 如果失败:将数据保存到原始文件,记录错误,向 IT 发送邮件,打开红灯。

听起来很可悲……但有时这是唯一可行的方法。

于 2011-06-27T14:10:25.027 回答