2阶段提交实施

时间:2019-05-28 10:55:30

标签: transactions unique-key document-database 2phase-commit

我正在尝试在文档数据库上实施两阶段提交,该数据库仅使用插入数据上的事务信息来支持单阶段提交。

我了解两阶段提交背后的理论,但实际上存在一些障碍。

比方说,有一个定义了唯一ID的集合,并且事务包括更新文档的多个字段。 因此,为了在回滚的情况下保存旧数据,我无法覆盖现有文档,但是需要添加一个新文档并用事务ID对其进行标记:

解决方案1:

准备阶段:

  1. 将具有更新字段的新文档插入到主集合中,并用当前交易ID进行标记。
  2. 将旧文档标记为已删除,直到提交并用当前交易ID标记。

提交阶段:

  1. 从添加的(更新的)文档中删除交易ID。
  2. 删除旧文档(标记为已删除)

问题:由于我要添加另一个具有相同唯一ID的文档,因此准备阶段的第1部分将失败(尽管这只是出于交易目的,但仍然会失败)。

解决方案2:

准备阶段:

  1. 将具有新字段的新文档插入临时集合,并用当前交易ID进行标记。
  2. 将主集合中的旧文档标记为已删除,直到提交,然后使用当前交易ID进行标记。

提交阶段:

  1. 将新文档从临时集合移至主集合。
  2. 从主集合中删除旧文档(标记为已删除)。

问题:将文档从临时集合移动到主集合时,如果存在唯一的密钥冲突,则提交阶段1可能会失败。
但是,我不允许在提交阶段发生此错误,因为为时已晚,我希望唯一的键约束在准备阶段失败。

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

0 个答案:

没有答案