Я отправляю код с некоторыми дополнительными комментариями
def post(self):
key = self.request.get('key')
# this gets the most recent entity using the key
obj = db.get(key)
if not obj.property:
# You should do the most recent check inside the transaction.
# After the above if-check the property might have changed by
# a faster request.
update_obj(ojb.key()) # transactional method to update obj and set value to True
if obj.property:
# do something else
Рассмотрим операции, как группа действий по организации, которая будет все выполняют или все терпят неудачу.
Сделки гарантируют, что что-либо внутри них останется неизменным. Если что-то изменяет сущность и становится иным, чем было, транзакция завершится неудачно, а затем повторится.
Другой подход, если я понимаю, что вам нужно:
def post(self):
key = self.request.get('key')
self.check_obj_property(key)
# continue your logic
@db.transctional
def check_obj_property(key):
obj = db.get(key)
if obj.property:
#it's set already continue with other logic
return
# Its not set so set it and increase once the counter.
obj.property = True
# Do something else also?
obj.count += 1
# Save of course
obj.put()
Как вы видите, я положил все свои чеки в транзакции. Приведенный выше код, если он запускается одновременно, будет только увеличивать счет один раз. Представьте, что это как счетчик, который подсчитывает, сколько раз obj.property
было установлено на True
Не делайте булевых тестов с 'is'. Просто используйте 'if not obj.property:' и 'else:'. – jonrsharpe