这种交易方法会起作用吗?

时间:2014-02-16 16:21:35

标签: google-app-engine python-2.7 google-cloud-datastore

我正在尝试为应用引擎数据存储区编写一个事务方法,但很难测试它是否正常工作,所以我首先尝试验证我的方法。我有一个post请求,检查属性是否为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

1 个答案:

答案 0 :(得分: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的次数