У меня есть объект SomeObject, который представляет объект, сохраненный как документ в Couchbase. У SomeObject есть переменная cas для хранения значения CAS.
У меня есть такой код:
/* Get two identical objects from Couchbase, they'll have identical CAS value */
SomeObject someObjectA = getSomeObjectFromCouchbase(sameId);
SomeObject someObjectB = getSomeObjectFromCouchbase(sameId);
/* Make arbitrary modifications to the objects */
someObjectA.getListInObject().add(arbitraryValue1);
someObjectB.getListInObject().add(arbitraryValue2);
/* Convert SomeObject objects to JsonDocument objects, ensuring the CAS value is set */
JsonDocument jsonDocA = JsonDocument.create(someObjectA.getId(), JsonObject.fromJson(mapper.writeValueAsString(someObjectA)), someObjectA.getCas());
JsonDocument jsonDocB = JsonDocument.create(someObjectB.getId(), JsonObject.fromJson(mapper.writeValueAsString(someObjectB)), someObjectB.getCas());
/* Perform upserts on both JsonDocument objects; expectation is the second one should fail with CASMismatchException because the CAS value should have changed after the first upsert */
couchbaseDao.getDatasource().getBucket().upsert(jsonDocA, writeTimeout, TimeUnit.MILLISECONDS);
couchbaseDao.getDatasource().getBucket().upsert(jsonDocB, writeTimeout, TimeUnit.MILLISECONDS);
Несмотря на мои ожидания, что второе обновление должно завершиться с CASMismatchException, который я пытаюсь поймать с помощью оборачивая код в блок try / catch, этого не происходит. Оба upserts успешны, и сервер действительно изменяет значение CAS после обоих upserts. Это как если бы он даже не проверял значение CAS при загрузке, просто слепо принимал что-то и затем обновлял значение CAS.
Конечный результат состоит в том, что список в документе Couchbase содержит толькоопроизвольное значение произвольного, а отсутствует произвольное произвольное значение1 в то время как я ожидал, что он будет иметь произвольное значение1, а не произвольное значение2 (так как второй переход должен был вызвать CASMismatchException). Я что-то не так делаю, или что-то не так с сервером, что он неправильно работает с CAS?