我有CouchBase服务器。
对并发文档突变:http://developer.couchbase.com/documentation/server/4.0/developer-guide/cas-concurrency.html
提出疑问在CouchBase中保存数据的代码示例:
try {
Yii::$app->Couch->set($key, $data, 0, '', 1);
} catch (\Exception $e) {
$already_saved = Yii::$app->Couch->get($key);
Yii::$app->Logger->alert(
'CouchBase exception',
[
'exception' => $e->getMessage(),
'key' => $key,
'need_saved' => $data,
'already_saved' => $already_saved,
'equal' => md5($already_saved)==md5(json_encode($data))
]
);
}
/**
* Store a document in the cluster.
*
* The set operation stores a document in the cluster. It differs from
* add and replace in that it does not care for the presence of
* the identifier in the cluster.
*
* If the $cas field is specified, set will <b>only</b> succeed if the
* identifier exists in the cluster with the <b>exact</b> same cas value
* as the one specified in this request.
*
* @param string $id the identifier to store the document under
* @param object|string $document the document to store
* @param integer $expiry the lifetime of the document (0 == infinite)
* @param string $cas a cas identifier to restrict the store operation
* @param integer $persist_to wait until the document is persisted to (at least)
* this many nodes
* @param integer $replicate_to wait until the document is replicated to (at least)
* this many nodes
* @return string the cas value of the object if success
* @throws CouchbaseException if an error occurs
*/
function set($id, $document, $expiry = 0, $cas = "", $persist_to = 0, $replicate_to = 0) {
}
但是我收到的所有邮件的费用低于0.002%例外:
CouchBase异常。该文件发生了变异。
在文档中找到:
CAS是Compare And Swap的首字母缩写,被称为一种形式 乐观锁定。 CAS可以由应用程序提供给 变异操作(插入,upsert,替换)。申请时 提供CAS,服务器将检查应用程序提供的版本 CAS针对自己的CAS版本:
如果两个CAS值匹配(它们比较成功),则变异操作成功。
如果两个CAS值不同,则变异操作失败
但仍然无法理解,这种突变意味着什么?
为什么CAS值匹配,然后变异操作成功,是不是只重写了消息数据?
为什么如果值不同,那么变异操作会失败?
为什么我收到此例外?
答案 0 :(得分:0)
您可以将CAS视为&#34;修订号&#34;,它描述了该文档,但这些&#34;修订号&#34;没有订购,你只允许告诉两个修订是否相同。对于文档的每次更改,服务器都将生成新的CAS值(即使您使用相同的内容重写主体,设置过期时间或锁定密钥)。
因此,您可能会在文档更改发生时看到CAS不匹配错误,但内容仍然相同,我可以根据您从身体计算md5的方式来猜测,而不使用CAS。