所以我正在阅读这两个阶段的提交: http://docs.couchbase.com/couchbase-devguide-2.5/#performing-two-phase-commits
AFAIK,Couchbase操作是原子的。 文章解释了在执行两阶段提交时,我应该创建一个 Trans:1 文档,其中包含事务进度的状态。 1)首先从 Init 状态开始。
2)当交易开始开始时,我应该将 Trans:1 的状态切换为 pend 。 通过切换到 pend 状态,我们可以阻止其他进程获取相同的事务。
3)然后更新目标文档的内容(例如 dipti 和 karen )以同时包含 trans 。 *如果在任何一个文档的更新过程中出现任何问题,我们可以通过检查 trans:1 文档的状态等于 pend *
进行回滚所以这是我的问题:
a)由于Couchbase操作是原子的,如果有多个进程尝试获取事务 trans:1 ,有机会说进程A 得到 trans:1的state = init ,在进程A更新 trans:1的state = pend 之前,进程B 也可能得到相同的结果 trans:1的state = init 并尝试执行更新。
b)同样的原因,当一个流程将 trans :: 1 状态更新为挂起时,请更新 dipti 和 karen 。因为操作是原子的,它们不能真正同时更新,只能一个接一个地更新。 那么我们如何防止其他过程无法获得/更新 dipti 和 karen 的价值?因为它们的值没有完全更新。
c)Couchbase不像Couchdb那样进行版本控制,我们如何实际回滚?
d)保持 trans:1 并设置为状态:完成的重点是什么?为什么不在我们知道完成后删除整个文档?
e)最后一个问题,实际上我应该如何处理交易文件?我的意思是,我应该运行一个服务,不断检查Linux中的所有Transition文档或什么?每次机器重启时都会运行?
(使用cas()方法的示例和代码,我不知道PHP SDK中的等价物,我想是指get()?)
目前我的方法是: 当 trans:1 为 state:init 时,该过程将 getAndLock 所有必要的文档( dipti 和 karen )并创建每个文档的副本( trans:1 :: dipti 等) 当 trans:1 为 state:pend 时,该流程会使用状态:已处理更新每个文档,因此我知道哪些文档已更新且需要如果有任何失败,请回滚(从文件副本)。 回滚将删除所有复制文档以及 trans:1 。
但它仍然无法阻止其他进程在更新时获得 dipti 和 karen 。 (即获得所有人的金额总计)。