我正在尝试在文档数据库上实施两阶段提交,该数据库仅使用插入数据上的事务信息来支持单阶段提交。
我了解两阶段提交背后的理论,但实际上存在一些障碍。
比方说,有一个定义了唯一ID的集合,并且事务包括更新文档的多个字段。 因此,为了在回滚的情况下保存旧数据,我无法覆盖现有文档,但是需要添加一个新文档并用事务ID对其进行标记:
解决方案1:
准备阶段:
提交阶段:
问题:由于我要添加另一个具有相同唯一ID的文档,因此准备阶段的第1部分将失败(尽管这只是出于交易目的,但仍然会失败)。
解决方案2:
准备阶段:
提交阶段:
问题:将文档从临时集合移动到主集合时,如果存在唯一的密钥冲突,则提交阶段1可能会失败。
但是,我不允许在提交阶段发生此错误,因为为时已晚,我希望唯一的键约束在准备阶段失败。
那么实现两阶段提交机制并避免这些问题的正确方法是什么?