Couchbase Get() с последующим атомарным Increment()

У меня есть программа, которая делает следующее:

  1. Проверьте, присутствует ли ключ в кушетке, используя Get()

  2. Если он присутствует, ничего не делайте, верните false вызывающему приложению.

  3. если ключ отсутствует, то увеличьте его со значением 1.

Таким образом, значение моего ключа, созданного с помощью Increment, всегда будет равно 1 и фактически не будет увеличиваться (я использую Increment только для создания ключа с использованием атомарности).

Мой вопрос: что, если операция Get() вызывается из 3 запросов одновременно?

Будет ли первый запрос успешно увеличивать ключ и будет ли указанный выше пункт номер 2 применим для оставшихся 2 запросов?

or

Будут ли все 3 запроса обращаться к точке номер 1, а затем увеличивать ключ 3 раза?

Я использую .NET SDK для кушетки.


person skywalker2909    schedule 17.05.2016    source источник


Ответы (1)


Просто используйте вставку вместо той последовательности операций, которую вы сейчас используете. Вставка является атомарной в отношении одного ключа, поэтому только одна сессия будет успешной, а все остальные одновременные/последующие вставки завершатся неудачно.

var result = await bucket.InsertAsync("key", 1);

Если операция завершается успешно, элемент ранее не существовал и был успешно создан со значением 1. Если произошел сбой с кодом ошибки KEY_EXISTS, то элемент уже существовал, предположительно со значением 1, если его больше ничего не изменило.

person David Ostrovsky    schedule 18.05.2016
comment
Работает !! Большое спасибо за Вашу помощь.. ! Очень признателен ! - person skywalker2909; 18.05.2016