【问题标题】:Will this transaction method work?这种交易方式会奏效吗?
【发布时间】:2014-02-16 16:21:35
【问题描述】:

我正在尝试为应用引擎数据存储编写一个事务方法,但很难测试它是否有效,因此我尝试首先验证我的方法。我有一个 post 请求,它检查一个属性是否为真,如果不为真,则执行其他操作并将其设置为真。

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

【问题讨论】:

  • 不要对 is 进行布尔测试。只需使用if not obj.property:else:

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


【解决方案1】:

我正在发布您的代码,并添加了一些 cmets

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 的次数

【讨论】:

  • 这正是我在第二种方法中所需要的。我要检查的最后一件事是,如果它已经更新,那么我想做其他事情;那应该在 check_obj_property 中吗?或者如果 self.check_obj_property(key): return False if obj.property: return False 是否应该回到原来的方法中
  • @DanielYoung 是的,检查交易的返回值,然后做其他事情。在这种方法中,您使用类似阻止程序的事务。稍后在您的代码中,根据复杂性(如果您再次将值设置为 False),您可能还需要使用另一个事务。
  • 并且事务知道如果返回就停止重试? (如果它已经更新)。
  • @DanielYoung 如果同时属性设置为true,ta会重复。但是因为我们的逻辑在事务内部,所以它会检查值并返回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 2015-04-25
相关资源
最近更新 更多