Безопасное резервирование имени на appengine - PullRequest
0 голосов
/ 11 марта 2011

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

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

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

Имеет ли смысл создавать своего рода индексную сущность, которая использует имя группы в ключе, чтобы я мог выполнить запрос предка, чтобы выбрать и создать имя атомарно? Успешное создание объекта индекса будет служить разрешением для выполнения нетранзакционного кода. Я хотел бы надеяться на более простое решение, которое не требует совершенно нового типа сущности.

Ответы [ 4 ]

1 голос
/ 17 марта 2011

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

Помните о транзакционных последствиях этого: неожиданные сбои могут привести к именам, которые зарезервированы, но не используются.

0 голосов
/ 29 июля 2011

Вы, ребята, действительно думаете, что транзакции могут служить блокировкой потоков?Нет.

Кроме того, лучший способ избежать состояния гонки в среде параллельных вычислений - избежать конфликтующих записей.То есть, пересмотрите свою структуру, задержите и соберите записи с именами групп в один поток.Да, это не в реальном времени, но я сомневаюсь, что вам действительно нужно генерирование имени группы в реальном времени.Помните, везде используйте асинхронность и принимайте несогласованность, если вы хотите больше, чем просто игрушечная система.

0 голосов
/ 12 марта 2011

Нет ли способа использовать имя группы (или хеш на основе имени) в качестве ключа? Потому что это + group.get_or_insert (group_name) в основном решит ваши проблемы. Этот метод автоматически запускается в транзакции и либо создает, либо извлекает объект с этим именем ключа.

0 голосов
/ 11 марта 2011

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

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