3

設定は次のとおりです。エンティティクラスには、遅延ロードされる他のエンティティのコレクションがあります。秘訣は、データ関連の作業を実行する必要があることです(たとえば、コレクションの要素を使用して特定のチェックサムを計算したい)。

ここでの秘訣は、「データ計算中に誰かがエンティティを更新した」などの競合状態を絶対に避けたいということです。通常の状況では、ゲッター/セッターの同期を宣言するだけで、満足します。しかし、私が理解している限り、他のスレッドがデータベースからエンティティの状態を更新することを決定した場合、チェックサムを計算している最中に、「同期された」メソッドを完全に無視します(フィールドに直接アクセスします)。

私は間違っているかもしれません。したがって、問題は、最初のチェックサム計算時に、エンティティの一部またはエンティティ全体へのアクセスを「ロック」する方法はありますか?

前もって感謝します!PS問題を説明するためのコードスニペットが必要な場合は、お知らせください。これまでのところ、質問はかなり明確だと思います。

4

2 に答える 2

4

私は間違っているかもしれません。したがって、問題は、最初のチェックサム計算時に、エンティティの一部またはエンティティ全体へのアクセスを「ロック」する方法はありますか?

JPA 2.0は悲観的な並行性をサポートしており、エンティティを読み取って対応する行をデータベースレベルでロックできます(前述のリンクはJPA 2.0仕様の最終バージョンよりも前のものであり、LockMode列挙型のすべての可能な値を反映しているわけではありませんが、アイデアを得る)。

また、JPA 1.0を使用している場合は、同等のを実行するためにネイティブSQLを使用する必要がありますSELECT ... FOR UPDATE

参考文献

  • JPA2.0仕様
    • セクション3.4.4「ロックモード」
于 2010-09-24T05:25:16.170 に答える
1

エンティティの属性で@Versionを使用することもできます(JPA 1.0で機能します)

http://java.dzone.com/articles/jpa-20-concurrency-and-locking

于 2011-09-21T14:00:16.787 に答える