3

マルチスレッド Web アプリケーションからSpring Data JPA save(Object entity) メソッドを使用してオブジェクトを保存しています。

時折、次を使用してセッションからオブジェクトをロードすると、次のことがわかります。

findOne(long id)

セッションから返されたオブジェクトは古く、データベースの最新バージョンを反映していません。このアプリケーションからのデータのみを保存し、Spring Data JPA インターフェースの 1 つのインスタンスのみを使用しています。

何が原因で、どうすれば修正できますか?

4

1 に答える 1

3

Hibernate は PreparedStatement#executeUpdate の結果を使用して、更新された行数をチェックします。行が一致しなかった場合、StaleObjectStateException (Hibernate API を使用している場合) またはOptimisticLockException (JPA を使用している場合) をスローします。

楽観的ロックは、汎用目的の同時実行制御手法であり、物理レベルのトランザクションとアプリケーション レベルのトランザクションの両方で機能します。

したがって、古い例外は、複数の同時要求が同じ共有永続データを変更する場合の「更新の消失」現象を防ぎます。

アプリケーション レベルのトランザクションでは、エンティティをロードすると、第 1 レベルのキャッシュ (永続コンテキスト) により論理的な反復可能な読み取りが取得されますが、他のユーザーは前述のエンティティを変更できます。

したがって、確かに古いエンティティに遭遇する可能性がありますが、オプティミスティック ロック メカニズムにより、追加のデータベース ロックを取得せずに更新が失われるのを防ぎ、長い会話でも機能します。

于 2014-09-24T20:19:38.597 に答える