0

数日前、私はトランザクションと冪等性について質問を投稿しましたが、あまり反応がありませんでした。

Google App Engine: (Python) データストア トランザクションと冪等性

今日、トランザクションはデータストアの機能であることに気付きましたが、ほとんどの場合、Memcache からデータを取得し、一連の作業を行ってから、memcacheデータストアに保存しています。

データが memcache にない場合にのみ、データストアからデータを取得します。

関数をトランザクションに配置すると、別のリクエストが memcache から同じデータをプルするのを防ぐことができますか?

例は通常、次のようになります。

Begin Transaction
    Get Data from Datastore
    Do Work on data
    Put data back in Datastore

私のコードでは、ほとんどの場合、このように見えます

 Begin Transaction
    Get data from Memcache
    if not data:
        Get data from Datastore
    Do work on data
    Put to Memcache
    Put to Datastore

これは機能しますか?

トランザクション コードは、ブロック全体が同時に実行されるのを防止するのに十分なほどスマートですか? または、ロックはトランザクション関数の最初のデータストア操作から最後のデータストア操作までのみですか?

2 つの要求が memcache から同じデータをプルして作業を行っているが、データをデータストアに戻すときに衝突せず、後者の要求が最初の要求の変更を踏みにじる可能性はありますか?

4

1 に答える 1

3

いいえ、データベース トランザクションは memcache にまたがりません。

また、トランザクションはロックされません。彼らは楽観的同時実行制御を使用します。内部では、すべての db エンティティに更新時間があり、トランザクションのコミット時にチェックされます。トランザクションで使用されるエンティティ (= エンティティ グループ) の更新時間が変更された場合、トランザクションはダーティであり、例外がスローされます - トランザクション全体を繰り返す必要があります (これは低レベルの場合です。Python NDM がこの作業の一部を行うと思います) .

したがって、トランザクションを行うには、最初にデータストアからデータをロードして、トランザクションが機能するために必要な「更新時間」を取得する必要があります。コードは機能しますが、トランザクションにはなりません。

于 2013-03-08T07:01:28.060 に答える