Transactions 2阶段提交实现

Transactions 2阶段提交实现,transactions,unique-key,document-database,2phase-commit,Transactions,Unique Key,Document Database,2phase Commit,我试图在文档数据库上实现两阶段提交,该数据库只支持使用插入数据上的事务信息进行单阶段提交 我理解2阶段提交背后的理论,但在实践中存在一些障碍 假设有一个定义了唯一ID的集合,事务包括更新文档的多个字段。 因此,为了在回滚时保存旧数据,我不能覆盖现有文档,但需要添加一个新文档并用事务ID标记它: 解决方案1: 准备阶段: 使用更新的字段将新文档插入到主集合中,并使用当前事务ID对其进行标记 在提交之前,将旧文档标记为已删除,并使用当前事务ID对其进行标记 提交阶段: 从添加(更新)的文档中删除事务

我试图在文档数据库上实现两阶段提交,该数据库只支持使用插入数据上的事务信息进行单阶段提交

我理解2阶段提交背后的理论,但在实践中存在一些障碍

假设有一个定义了唯一ID的集合,事务包括更新文档的多个字段。 因此,为了在回滚时保存旧数据,我不能覆盖现有文档,但需要添加一个新文档并用事务ID标记它:

解决方案1:

准备阶段:

  • 使用更新的字段将新文档插入到主集合中,并使用当前事务ID对其进行标记
  • 在提交之前,将旧文档标记为已删除,并使用当前事务ID对其进行标记
  • 提交阶段:

  • 从添加(更新)的文档中删除事务ID
  • 删除旧文档(已标记为已删除)
  • 问题:准备阶段的第1部分将失败,因为我正在添加另一个具有相同唯一ID的文档(尽管这只是为了事务,但仍然会失败)

    解决方案2:

    准备阶段:

  • 将新文档插入到具有更新字段的临时集合中,并使用当前事务ID对其进行标记
  • 在提交之前,将主集合中的旧文档标记为已删除,并使用当前事务ID对其进行标记
  • 提交阶段:

  • 将新文档从临时集合移动到主集合
  • 从主集合中删除旧文档(已标记为已删除)
  • 问题:如果将文档从临时集合移动到主集合时存在唯一密钥冲突,提交阶段第1部分可能会失败。
    但是,我不能允许在提交阶段发生此错误,因为为时已晚,我希望唯一密钥约束在准备阶段失败

    那么,实现两阶段提交机制并避免这些问题的正确方法是什么