2014-02-16 2 views
1

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

def post(self): 
    key = self.request.get('key') 
    obj = db.get(key) 
    if obj.property is False: 
     update_obj(ojb.key()) // transactional method to update obj and set value to True 

    if obj.property is True: 
     // do something else 
+0

Не делайте булевых тестов с 'is'. Просто используйте 'if not obj.property:' и 'else:'. – jonrsharpe

ответ

3

Я отправляю код с некоторыми дополнительными комментариями

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

+0

Это именно то, что мне нужно во втором подходе. Последнее, что я хочу проверить, это то, что если он уже обновлен, я хочу сделать что-то еще; должно ли быть в check_obj_property? Или вернемся к исходному методу, например self.check_obj_property (key): return False 'if obj.property: return False' – user1961

+0

@DanielYoung да проверить возвращаемое значение транзакции, а затем сделать что-то еще. При таком подходе вы используете транзакцию как блокиратор. Позже в вашем коде, в зависимости от сложности (если вы снова установите значения для False), вам может понадобиться использовать и другую транзакцию. –

+1

И транзакция знает, чтобы остановить повторную попытку, если она вернется? (в случае, если он уже был обновлен). – user1961

Смежные вопросы