Атомарное обновление 2 документов Couchbase

Не могли бы вы подсказать, есть ли способ атомарно обновить несколько документов в Couchbase с помощью Java SDK? Я знаю, что можно использовать Embedding документов, таким образом гарантируя необходимое, но, к сожалению, у меня это не получается.

В моем случае факт обновления документа приводит к тому, что необходимо сделать недействительным (установить специальный флаг в false) другой документ, и это должно выполняться атомарно.

Я благодарен за любую помощь или предложения с вашей стороны. Спасибо!


person Andrei Safronov    schedule 19.05.2016    source источник


Ответы (2)


Хотя встроенного способа внесения атомарных изменений в несколько документов нет, вы можете использовать двухфазную фиксацию для достижения того же результата. Обратите внимание, что в этом случае 2PC не предоставляет других транзакционных функций, таких как изоляция и согласованность, только атомарность - это то, о чем вы просите. В Java для Couchbase нет эталонной реализации 2PC, но в документации есть две в Ruby и PHP. Я рекомендую прочитать документацию по обеспечению транзакционной логики в Couchbase. для подробного описания того, как это реализовать. Перенос кода примера на Java должен быть довольно простым.

Вообще говоря, чтобы реализовать набор изменений в нескольких документах атомарно, вы выполняете атомарную запись в каждый документ по очереди, а также во временный документ «состояния», таким образом, чтобы каждый шаг в процессе был уникальным. Таким образом, вы можете продолжить с того же шага или отменить свои изменения, если транзакция по какой-либо причине прервана посередине.

person David Ostrovsky    schedule 21.05.2016
comment
Привет Дэвид! Спасибо за ваш ответ! Выглядит интересно! Постараюсь разобраться в этом! Думаю, пока это лучший результат ... Спасибо! - person Andrei Safronov; 23.05.2016

К сожалению, это сводится к транзакции, а Couchbase не предлагает встроенную поддержку транзакций. Уровень атомарности, которого вы можете достичь с помощью Couchbase, находится на уровне одного документа.

Я знаю, что некоторые пользователи couchbase реализовали ручное управление транзакциями на своем уровне прикладного кода, но это довольно сложная тема, и я не знаю ни одного открыто доступного решения.

person Simon Baslé    schedule 19.05.2016