Couchbase上的两阶段提交

Couchbase上的两阶段提交,couchbase,Couchbase,所以我读到了关于两阶段提交的内容: 好了,Couchbase的操作是原子的。 文章解释了在执行两阶段提交时,我应该创建一个Trans:1文档,其中包含事务进度的状态。 1) 首先是从Init状态开始 2) 当事务开始处理时,我应该将Trans:1的状态切换到pend。 通过切换到pend状态,我们可以防止其他进程拾取同一事务 3) 然后更新目标文档的内容(例如是dipti和karen),以同时包含trans。 *如果任何文档在更新过程中失败,我们可以通过检查trans:1文档的状态等于pend

所以我读到了关于两阶段提交的内容:

好了,Couchbase的操作是原子的。 文章解释了在执行两阶段提交时,我应该创建一个Trans:1文档,其中包含事务进度的状态。 1) 首先是从Init状态开始

2) 当事务开始处理时,我应该将Trans:1的状态切换到pend。 通过切换到pend状态,我们可以防止其他进程拾取同一事务

3) 然后更新目标文档的内容(例如是diptikaren),以同时包含trans。 *如果任何文档在更新过程中失败,我们可以通过检查trans:1文档的状态等于pend*

下面是我的问题:

a) 由于Couchbase操作是原子操作,如果有多个进程试图获取事务trans:1,则有可能在进程更新trans:1的状态=pend之前说进程a得到了trans:1的状态=init进程B也可能得到相同的结果trans:1的state=init,并尝试执行更新

b) 同样的原因,当一个进程将trans::1状态更新为pend时,更新dipti和karen。因为操作是原子的,所以它们不能真正同时更新,只能一个接一个地更新。 那么,我们如何防止其他进程不获取/更新diptikaren的值?因为它们的值没有完全更新

c) Couchbase不像Couchdb那样进行版本控制,我们实际上如何回滚

d) 保持trans:1并设置为state:done有什么意义?为什么不在我们知道已完成时删除整个文档

e) 最后一个问题,实际上我应该如何使事务文档被提取?我的意思是,我应该运行一个服务,不断检查Linux或其他系统中的所有转换文档吗?每次机器重新启动时都在运行吗

(这里的示例和代码使用cas()方法,我不知道PHP SDK中的等价物是什么,我想是means get()?)

目前我的做法是: 当trans:1状态:init时,进程将获取并锁定所有必要的文档(diptikaren),并创建每个文档的副本(trans:1::dipti等) 当trans:1state:pend时,流程将使用state:Processed更新每个文档,因此我知道哪些文档已更新,如果出现任何故障,则需要(从文档副本)回滚。 “回滚”将删除所有复制文档以及trans:1


但它仍然不能阻止其他进程在更新时获得diptikaren。(即获取所有人的总金额)。

此处缺少的点是CAS,它代表“比较和交换”,用于确保没有其他请求修改值。你可以在这里阅读更多信息:@jeffrymorris是的,他们的例子也使用CAS,我已经读过了。实际上,这是我的另一个问题:使用PHP SDK,查询的响应确实包含CAS值,但我在文档中没有看到任何与CAS相关的方法……顺便说一句,在Couchbase中称为Check and Set: