我遇到了一个小难题!我有一个叫 vote 的处理程序;当它被调用时,它将用户的投票设置为他们选择的任何内容。为了记住他们之前选择的选项,我存储了一个 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 对象的同时,处理这些请求的最有效和最快的方法是什么?