Есть ли в DynamoDB блокировка по умолчанию?

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

Из документации похоже, что вам нужно кодировать Java-приложение, чтобы использовать аннотацию @DynamoDBVersionAttribute и получать и устанавливать версии. Без этого похоже, что вы можете писать в DynamoDB без каких-либо блокировок.

Это правильно?

Кстати, я не слишком хорошо знаком с БД без какой-либо блокировки. Что произойдет, если 2 человека напишут один и тот же элемент одновременно в DynamoDB без какой-либо блокировки? Скажем, элемент, в который мы пишем, имеет 4 поля, будет ли одно записывать полностью неудачно или возможно, что DynamoDB обновит 2/4 поля с одной записью, а другие 2 поля с другой записью?


person Kevin    schedule 11.01.2018    source источник


Ответы (2)


Ты прав. По умолчанию DynamoDB НЕ имеет оптимистической блокировки. Существуют различные SDK для DynamoDB, и, насколько мне известно, единственный, который предоставляет оптимистическая блокировка - это Java SDK.

Вот что на самом деле поддерживает оптимистическая блокировка Java SDK:

  • Создает атрибут в вашей таблице под названием версия
  • Вы должны загрузить элемент из базы данных перед его обновлением.
  • Когда вы пытаетесь сохранить элемент, SDK проверяет, совпадает ли номер версии клиентского элемента с номером в таблице, и если это так, сохранение завершается и номер версии увеличивается.

Это довольно просто реализовать самостоятельно, если вы используете другой SDK. Атрибут версии можно создать самостоятельно. Вы должны создать оболочку для метода putItem (и любого другого необходимые операции сохранения / обновления). Вы должны использовать выражение условия чтобы проверить, что номер версии в базе данных на единицу меньше сохраненной вами версии.

Чтобы ответить на вторую часть вашего вопроса, оба обновления будут успешными (при условии, что вы не поставили никаких условий для своего обновления). Первый будет делать любые указанные обновления, а второй придет и перезапишет их.

person F_SO_K    schedule 11.01.2018
comment
Спасибо! Полагаю, каждая запись должна быть атомарной? Например, первая запись не может быть завершена частично, а затем начинается вторая запись. - person Kevin; 11.01.2018
comment
Правильно, частичных записей нет. puItem, updateItem и deleteItem являются атомарными. - person F_SO_K; 12.01.2018

Dynamodb по умолчанию не поддерживает оптимистическую блокировку. Как вы упомянули, вам необходимо использовать аннотацию в классе модели Java, чтобы использовать оптимистическую блокировку.

Если два потока записывают в один и тот же элемент, элемент Dynamodb будет иметь данные последней записи (т. Е. Последний поток, который записывает данные).

person notionquest    schedule 11.01.2018