Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 数据库同步_Database_Transactions_Distributed Transactions - Fatal编程技术网

Database 数据库同步

Database 数据库同步,database,transactions,distributed-transactions,Database,Transactions,Distributed Transactions,我正在开发的系统有一些问题。我有一个python脚本,它首先与虚拟化软件一起工作,如果该操作成功,它会将内容写入数据库。 如果虚拟化软件中出现了一些异常,那么我可以管理所有事情,但如果插入数据库失败,真正的问题就会出现。如果insert失败,我将不得不在该虚拟化软件中恢复,否则事情将变得异步。但问题是,在那个软件中恢复东西并非总是可能的 如何处理事情,使我可以保持数据库与该软件同步?有中间产品或特殊应用吗???还是编程中的逻辑 您希望系统中的两个操作(OP:虚拟软件中的操作;WDB:写入数据库)

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


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

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


  • 打开TX(以DB为单位的事务)
  • WDB
  • OP
  • 如果操作成功,提交发送,否则回滚发送
  • 只有在写入DB的内容不依赖于OP操作时才可行(不可能)


  • OP1(操作的第一阶段:得到结果,但不改变任何内容)
  • 开放式TX
  • WDB
  • OP2(第二阶段:修改虚拟软件)
  • 提交或回滚
  • (步骤4-5可以切换)这将是一个穷人的“两阶段提交”实现。只有当你能将你的行动分为这两个阶段时才可行


  • 开放式TX
  • 虚拟WDB(将虚拟结果写入数据库)
  • 回滚发送
  • OP
  • WDB
  • 这将检查数据库是否可操作,在尝试实际操作和写入之前进行虚拟写入。可行,但并非万无一失


  • OP
  • WDB
  • 如果失败:将数据保存到原始文件,记录错误,向其发送邮件,打开红灯
  • 听起来很可怜。。。但有时这是唯一可行的方法