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 может быть предоставлен приложениями для операций мутации (вставка, вставка, замена). Когда приложения предоставляют CAS, сервер проверяет предоставленную приложением версию CAS на соответствие своей собственной версии CAS:

  • Если два значения CAS совпадают (они успешно сравниваются), то операция мутации завершается успешно.

  • Если два значения CAS различаются, операция мутации завершается неудачно


Но до сих пор не могу понять, что означает эта мутация?

  • Почему, если значения CAS совпадают, тогда операция мутации завершается успешно, не просто ли она перезаписывает данные сообщения?

  • Почему, если значения различаются, операция мутации завершается неудачно?

  • Почему я получаю это исключение?

1 ответ

Вы можете думать о CAS как о "номере редакции", который описывает документ, но эти "номера редакции" не упорядочены, вы можете только сказать, являются ли две редакции одинаковыми или нет. При каждом изменении документа сервер будет генерировать новое значение CAS (даже если вы переписываете тело с тем же содержимым, устанавливаете срок действия или блокируете ключ).

Таким образом, вы могли видеть ошибки несоответствия CAS, когда произошла смена документа, но содержание все еще остается тем же, я могу догадаться по тому, как вы вычисляете md5 из тела без CAS.

Другие вопросы по тегам