4

2 つのコード例 (簡略化):


トランザクション外の .get (トランザクション関数に渡される .get からのオブジェクト)

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

.トランザクション内に入る

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

最初の例は論理的に適切ですか? そこのトランザクションはまったく役に立ちますか、それは何かを提供しますか? appengine のトランザクションを理解しようとしています。2 番目のオプションを選択すると、そのオブジェクトの同時変更が妨げられますか?

4

1 に答える 1

4

あなたの質問に一言で答えるには:はい、あなたの2番目の例はそれを行う方法です. トランザクションの境界では、データを取得して変更し、新しい値をコミットします。

から読んでいないので、最初のものは間違っていませんobj。そのため、以前に返された値と同じではない場合でも、気付かないでしょう。別の言い方をすれば、書かれているように、あなたの例は、通常「テストと設定」と呼ばれるトランザクションのポイントを説明するのに適していません。ここでウィキペディアの優れた記事を参照してください: http://en.wikipedia.org/wiki/Test-and-set

GAE docsで定義されているように、GAE に固有のトランザクションは次のとおりです。

1 つ以上のエンティティに対するデータストア オペレーションのセット。各トランザクションはアトミックであることが保証されています。つまり、トランザクションが部分的に適用されることはありません。トランザクション内のすべての操作が適用されるか、またはどれも適用されません。

これは、テストと設定のためだけである必要はなく、複数のエンティティのバッチ コミットを確実にするためにも役立つ可能性があることを示しています。

于 2013-08-07T08:45:10.857 に答える