1

トランザクションのロックを理解しようとしているのと同様のコードが以下にあります。

DAOT.repeatInTransaction(new Transactable() {
        @Override
        public void run(DAOT daot)
        {
                Points points = daot.ofy().find(Points.class, POINTS_ID);
                // do something with points
                takes_a_very_long_time_delay(); // perhaps 10 secs
                daot.ofy().put(points);
        }
});

上記のコードは、Javaサーブレット内から実行されます。たとえば、操作は10秒間機能することが期待されます。その間に、エンティティを削除する別のサーブレットを呼び出すテストがありますPoints。上記のトランザクションが終了した後、削除操作が失敗するか、少なくともエンティティを削除することを期待していました。

ただし、上記のコードが実行されている間にエンティティが削除されました。私の実際のアプリケーションでは、存在しないエンティティにアクセスまたは編集しようとしたときに例外をスローするための例外処理を追加しました。

そこから、Entity not found"上記のコードでエンティティを削除するサーブレットを実行した直後に、アプリケーションが「例外」をスローします。

私はすでにGAEトランザクションを使用していますが、まだ何かが足りないと思います。そのため、テストは失敗します。

Deleteサーブレットを使用したdeleteトランザクションのコード:

DAOT.repeatInTransaction(new Transactable() {
        @Override
        public void run(DAOT daot)
        {
                Points points = daot.ofy().find(Points.class, POINTS_ID);
                daot.ofy().delete(points);
        }
});

deleteエンティティのなどの新しい操作が、トランザクション中にエンティティで現在の操作が発生するまで待機するようにするにはどうすればよいですか?

4

2 に答える 2

5

App Engineは、ロックではなく、楽観的同時実行性を使用します。つまり、エンティティのグループでのトランザクションは、トランザクションの実行中に他のプロセスがそれらのエンティティを変更することを妨げません。代わりに、トランザクションがコミットを試みると、トランザクションの実行中に変更が行われたかどうかがチェックされ、変更があった場合は変更が破棄され、関数が最初から再実行されます。

于 2012-07-09T04:54:54.153 に答える
1

objectifyを使用してデータストアを操作すると仮定します。まず、daot.ofy()がObjectifyFactory.begin()ではなく明示的なトランザクションセット(ObjectifyFactory.beginTransaction())を持つobjectifyインスタンスを返すことを確認する必要があります。次に、find()呼び出しとdelete()呼び出しの両方(およびfind()/ putペア)に同じobjectifyインスタンスを使用していることを確認してください。

于 2012-07-06T20:24:44.897 に答える