0

以前に質問を投稿しましたdatastore: Deleteing entities outside transactionsが、あまりうまくいきませんでした。おそらく私は問題を説明するのが複雑すぎたので、別の質問でその問題を解決しようとします:

私は自分のエンティティでトランザクションを使用しておらず、コミットされた更新をダーティリードのために失う可能性があり、それで完全に問題ないことに気付きました (主に統計)。私が確実に必要とする唯一のことは、ダーティリードが既に行われた後にそれを削除しても、更新がまだコミットされていない場合、そのエンティティは書き戻されないということです。削除はまれで、更新は多いため、トランザクションを使用して競合やパフォーマンスの問題を引き起こしたくありません。

Servlet A
{
   entity = persistenceManager.getObjectById(Entity.class, key)
   //Stuff
   persistenceManager.deletePersistent(entity);
}


Servlet B
{
   entity = persistenceManager.getObjectById(Entity.class, key) // dirty read made before deletion

   //Updated some fields, after deletion was commited
   persistenceManager.flush(); ? the object would be written back
}

上記のケースをテストするには、B でダーティ リードと削除の間に 20 秒のスリープを導入し、オブジェクトを書き戻します (実際、それが最初の質問の答えであり、その質問が更新されます)。

A がエンティティを削除しようとしていることをエンティティに知らせる前に、memcache に依存してサーブレット B に許可することはできますかサーブレット B のエンティティを読み取るべきではありません。memcache はデータを削除しないことを保証しないことを知っていますが、存在する場合、サーブレット B から即座にアクセスできますか?

より良いアイデアはありますか?

4

1 に答える 1

0

サーブレットBでトランザクションtoを使用して、書き込む前にエンティティがまだ存在することを確認します。

なぜ取引を避けているのですか?それがトランザクションの目的であり、トランザクションがないと、データの同期を保証できません。

于 2012-07-25T15:19:02.983 に答える