Как получить значение CAS при выполнении обновления с помощью api вложенного документа couchbase?

Я хочу выполнить обновление документов. Я использую api вложенного документа couchbase для обновления документов.

Во время обновления у меня под рукой только идентификатор документа. Однако, чтобы получить текущее значение Cas, мне нужно добраться до кушетки.

Мое обновление выглядит так:

PrimaryBucket.mutateIn(document_id).upsert("path1","updatevalue1").upsert("path2","updatevalue2")

Чтобы справиться с оптимистической блокировкой, я хочу использовать "mutateIn(id).withCas(<currentcasvalue>)"

Во время обновления у меня под рукой только идентификатор документа. Однако, чтобы получить текущее значение Cas, мне нужно добраться до кушетки. Есть ли способ избежать выборки всего документа, чтобы получить только значение cas для выполнения обновления.

Это правильный подход?


person Reetika Ojha    schedule 29.07.2019    source источник
comment
Это похоже на проблему X / Y. Почему в этом случае вы хотите использовать оптимистическую блокировку? Если все, что у вас есть, это идентификатор документа, и вы ничего не знаете о текущем состоянии документа, то не очевидно, что выполнение сравнения и замены будет иметь желаемый эффект.   -  person dnault    schedule 29.07.2019


Ответы (1)


Да, способ есть. Вы можете выполнить поиск субдокумента, чтобы получить один небольшой путь из документа, и результат будет включать CAS:

long cas = PrimaryBucket.lookupIn(document_id).get("path1").execute().cas();

PrimaryBucket.mutateIn(document_id).upsert("path1","updatevalue1").upsert("path2","updatevalue2").withCas(cas).execute();

Если у вас нет гарантированно существующего пути, вы можете использовать одно из виртуальных полей xattr $ document следующим образом:

long cas = PrimaryBucket.lookupIn(document_id).get("$document.exptime", new SubdocOptionsBuilder().xattr(true)).execute().cas();
person Graham Pople    schedule 29.07.2019
comment
Хотя верно, что вы можете получить значение CAS таким образом, будьте осторожны с тем фактом, что Couchbase не использует предоставленное значение CAS для проверки параллелизма при выполнении обновления: Please note that this method will not use the Document.cas() for optimistic concurrency checks. If this behavior is needed, the replace(Document) method needs to be used. (docs.couchbase.com/sdk-api/ couchbase-java-client-2.5.6 / com /) - person mnicky; 09.01.2020
comment
@mnicky для операции обновления, которая действительно не поддерживает CAS. Но OP выполняет операцию под-документа mutateIn (), что и делает. - person Graham Pople; 10.01.2020