4

Two code examples (simplified):


.get outside the transaction (object from .get passed into the transactional function)

@db.transactional
def update_object_1_txn(obj, new_value):
    obj.prop1 = new_value
    return obj.put()

.get inside the transaction

@db.transactional
def update_object2_txn(obj_key, new_value):
    obj = db.get(obj_key)
    obj.prop1 = new_value
    return obj.put()

Is the first example logically sound? Is the transaction there useful at all, does it provide anything? I'm trying to better understand appengine's transactions. Would choosing the second option prevent from concurrent modifications for that object?

4

1 回答 1

4

一句话回答你的问题:是的,你的第二个例子就是这样做的方式。在事务的边界中,您获取一些数据,对其进行更改并提交新值。

不过,您的第一个并没有错,因为您没有从obj. 因此,即使它可能与先前返回的值不同,您也不会注意到。换句话说:正如所写,您的示例不擅长说明事务的点,这通常称为“测试和设置”。在这里查看一篇很好的维基百科文章:http ://en.wikipedia.org/wiki/Test-and-set

更具体到 GAE,如GAE 文档中所定义,事务是:

对一个或多个实体的一组 Datastore 操作。每个事务都保证是原子的,这意味着事务永远不会部分应用。要么应用事务中的所有操作,要么不应用它们。

它告诉您它不必只是用于测试和设置,它还可以用于确保多个实体的批量提交等。

于 2013-08-07T08:45:10.857 回答