Couchbase上的两阶段提交

时间:2015-07-13 01:13:58

标签: couchbase

所以我正在阅读这两个阶段的提交: 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 。 (即获得所有人的金额总计)。

0 个答案:

没有答案