数据库同步

时间:2011-06-27 13:40:46

标签: database transactions distributed-transactions

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

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

1 个答案:

答案 0 :(得分:1)

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


  1. 打开TX(DB中的交易)
  2. WDB
  3. OP
  4. 如果OP成功,则提交TX,否则回滚TX。
  5. 只有在您写入DB的内容不依赖于OP操作(不太可能)时才可行。


    1. OP1(操作的第一阶段:你得到结果,但不要改变任何东西)
    2. 打开TX
    3. WDB
    4. OP2(第二阶段:你修改了.software)
    5. 提交TX或回滚
    6. (可以切换步骤4-5)这将是一个穷人的“两阶段提交”实现。只有在这两个阶段可以划分您的操作时才可行。


      1. 打开TX
      2. 虚拟WDB(将虚拟结果写入数据库)
      3. 回滚TX
      4. OP
      5. WDB
      6. 这会检查数据库是否正常运行,在尝试实际操作和写入之前进行虚拟写入。可行,但不是万无一失。


        1. OP
        2. WDB
        3. 如果失败:将数据保存到原始文件,记录错误,向IT发送邮件,打开红灯。
        4. 声音可悲......但有时这是唯一可行的方法。