【问题标题】:Is it a valid transaction where my transactional method just completes the db.put() operation?我的事务方法刚刚完成 db.put() 操作是否是有效事务?
【发布时间】:2014-02-13 17:00:07
【问题描述】:

我曾尝试使我的整个 POST 方法具有事务性,但由于它调用了其他方法并因此被嵌套,所以无法做到。所以我所做的是创建一个事务方法来完成我的实体的 db.put()。

def post(self):
    myobj = db.get(key)
    myobj.property = x + 1
    second_method()
    my_txn(my_obj)

@db.transactional
def my_txn(obj):
    db.put(obj)

这是创建交易的有效方式吗?

【问题讨论】:

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


    【解决方案1】:

    不,我认为它对 TA 的概念没有任何用处。

    类似这样的:

    def post(self):
        second_method()
        my_txn(key)
    
    @db.transactional
    def my_txn(key):
        myobj = db.get(key)
        myobj.property = x + 1
        db.put(obj)
    

    您应该使用事务以确保读取(获取)和写入(放置)是一致的。

    通过这种方式,您知道当您获取实体时,直到您写入实体,如果同时发生任何更改,将中止此 TA 并重试(默认 3)。

    在您使用它的方式中,get 在事务之外,因此使事务无用

    【讨论】:

    • 谢谢!我必须将我的 POST 分解为非嵌套的方法。
    • 我可以问后续吗?这是否可以建立您的建议,如果我 db.get() post 方法中的实体对其进行操作,然后将其发送到事务只是为了在事务方法中通过键再次获取它后被复制。
    • @DanielYoung 如果计算不合理,那么可能是的。如果您依赖新的价值观,那么就不会。例如。如果您要增加计数器,那么这是一个坏主意。但是,如果您是 md5 对实体求和,然后将结果与密钥一起传递给事务,(密钥不会改变)那么是的,这将起作用。
    • 太棒了 - 我可以尝试以这种方式运行它 // method1: x = db.get(obj);修改x,method2(x.key, x),其中method2是事务性调用x键并赋值。
    • @DanielYoung 只要没有其他请求可以改变 x 然后是的
    猜你喜欢
    • 2021-11-13
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2018-10-25
    相关资源
    最近更新 更多