2014-02-16 57 views
1

我正在嘗試編寫應用程序引擎數據存儲的事務性方法,但很難測試它是否正常工作,所以我試圖首先驗證我的方法。我有一個帖子請求,檢查屬性是否爲true,如果不是true,則執行其他操作並將其設置爲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?或者它應該回到像這樣的原始方法if self.check_obj_property(key):return False'if obj.property:return False' – user1961

+0

@DanielYoung是檢查事務的返回值,然後執行其他操作。在這種方法中,您使用像攔截器一樣的事務。在後面的代碼中,根據複雜性(如果將值重新設置爲False),則可能還需要使用另一個事務。 –

+1

如果交易返回,交易會知道停止重試? (在已經更新的情況下)。 – user1961