Обработка конфликта с транзакциями группы объектов в Azure
В настоящее время я пишу метод, который для уменьшения затрат на транзакции вставляет сущности в Azure Table Services партиями по 100 штук.
Вставленные объекты являются неизменяемыми. То есть, если PartitionKey и RowKey идентичны между двумя объектами полномочий, это означает, что все остальные свойства также идентичны. Поэтому мне никогда не потребуется обновлять эту таблицу, потому что после вставки сущность останется прежней.
Проблема, с которой я сталкиваюсь, заключается в том, что в этом пакете я не могу быть на 100% уверен, что ни одна из сущностей не была вставлена ранее. Поэтому, если я просто вставляю сущности как обычно (через AddObject и SaveChanges), транзакция может завершиться с ошибкой, что сущность не может быть добавлена, потому что она уже существует. Поскольку транзакция является атомарной, это означает, что ни одно из прав не добавлено.
Я не могу проверить наличие каждой сущности в транзакции, потому что это будет слишком дорого (один запрос на сущность стоит слишком дорого, а один запрос с использованием ИЛИ приводит к сканированию таблицы по всей таблице). Поэтому мне нужен какой-то способ добавить объект, если он не существует, и игнорировать его или обновить его, если он существует (игнорирование или обновление для меня будут такими же, так как права неизменны).
Как мне добиться этого в Azure Table Services?
1 ответ
Согласно этой статье, в настоящее время нет способа "защитить" сущность, если она уже существует. Текущая рекомендация заключается в обработке запроса с использованием нескольких рабочих ролей и нескольких потоков, проверяющих существование каждого объекта.