DynamoDB поддерживает пессимистическую блокировку? - PullRequest
0 голосов
/ 03 октября 2018

обновлено

Оригинальный вопрос ниже - пересмотренный вопрос таков:

Игнорирование моего варианта использования ниже, с помощью динамо можно сделать старыйвылепленная пессимистическая блокировка, при которой весь элемент блокируется для одновременного доступа, пока я с ним не закончу?


Быстрый вопрос, согласно заголовку - все мои поиски в Google показывают только оптимистическую блокировку.

Хотите знать, возможно ли просто сделать эквивалент «выбрать для обновления»?

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

Спасибо.

1 Ответ

0 голосов
/ 03 октября 2018

Блокировка «элементов» предоставляется в качестве расширения на стороне клиента в Java SDK, вам нужно проделать определенную работу, чтобы фактически использовать его.

Причина этого заключается в распределенной природеДинамо БД.Обратите внимание, что блокировка не является классической блокировкой на основе строк на стороне сервера.Блокировка должна выполняться клиентами, использующими связанные «элементы».

Класс на стороне клиента для управления блокировкой называется «AmazonDynamoDBLockClient».Если вы ищете этот класс, вы найдете примеры его использования от разработчиков Amazon SDK.

Что нужно сделать с ним:

  • Добавить глобальный идентификатор для блокировки вспросите перед написанием «элемента»
  • Сообщите автору о блокировках и запретите запись в случае, если она «активна»
  • Тайм-аут блокировки, так что в случае смерти клиента блокировка снимается

Взятый прямо из такого примера:

    //build a lock client. any other client _not_ using this _same_ lock
    //can still modify the data! this is not 'safe' in this regard!
    final AmazonDynamoDBLockClient client = new AmazonDynamoDBLockClient(
        AmazonDynamoDBLockClientOptions.builder(dynamoDB, "customLockTable")
                .withTimeUnit(TimeUnit.SECONDS)
                .withLeaseDuration(100L)
                .withHeartbeatPeriod(40L)
                .withCreateHeartbeatBackgroundThread(createHeartbeatBackgroundThread)
                .build());
    //try to acquire a lock on the partition key "FirstPart"
    //of course this can fail, since someone else could have the lock
    final Optional<LockItem> lockItem =
            client.tryAcquireLock(AcquireLockOptions.builder("FirstPart").build());

Чтобы вышеприведенный код работал, вам нужно создать специальный 'customLockTable', он не является частью серверной части БД.природа.Поэтому приведенный выше пример неполон!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...