Я столкнулся с небольшой дилеммой! У меня есть обработчик, называемый голосованием; когда он вызывается, он устанавливает голос пользователя за то, что он выбрал. Чтобы запомнить, какие варианты они выбрали ранее, я сохраняю параметры VoteRecord, в которых подробно описывается, какой установлен их текущий голос.
Конечно, в первый раз, когда они голосуют, я должен создать объект и сохранить его. Но последующие голоса должны просто изменить значение существующего VoteRecord. Но тут возникает проблема: при некоторых обстоятельствах могут быть созданы два VoteRecords. Это редко (произошло только один раз из всех 500 голосов, которые мы видели до сих пор), но все же плохо, когда это происходит.
Проблема возникает из-за того, что два отдельных обработчика делают по существу следующее:
query = VoteRecord.all().filter('user =', session.user).filter('poll =', poll)
if query.count(1) > 0:
vote = query[0]
poll.votes[vote.option] -= 1
poll.votes[option] += 1
poll.put()
vote.option = option
vote.updated = datetime.now()
vote.put()
else:
vote = VoteRecord()
vote.user = session.user
vote.poll = poll
vote.option = option
vote.put()
poll.votes[option] += 1
poll.put()
session.user.votes += 1
session.user.xp += 3
session.user.put()
incr('votes')
Мой вопрос: каков наиболее эффективный и быстрый способ обработки этих запросов, гарантирующий, что ни один запрос не будет потерян и ни один запрос не создаст два объекта VoteRecord?