CouchBase异常。该文件发生了变异

时间:2016-04-29 20:51:29

标签: php couchbase

我有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值匹配,然后变异操作成功,是不是只重写了消息数据?

  • 为什么如果值不同,那么变异操作会失败?

  • 为什么我收到此例外?

1 个答案:

答案 0 :(得分:0)

您可以将CAS视为&#34;修订号&#34;,它描述了该文档,但这些&#34;修订号&#34;没有订购,你只允许告诉两个修订是否相同。对于文档的每次更改,服务器都将生成新的CAS值(即使您使用相同的内容重写主体,设置过期时间或锁定密钥)。

因此,您可能会在文档更改发生时看到CAS不匹配错误,但内容仍然相同,我可以根据您从身体计算md5的方式来猜测,而不使用CAS。