2

2 つのスレッドが同じオブジェクトを更新するときに発生する可能性のある休止状態の例外について誰か助けてもらえますか?

例: 名前が「a」、年齢が「30」、住所が「test」の従業員 スレッド 1 は「a」を「b」に更新しようとし、スレッド 2 は「a」を「c」に更新しようとします。

前もってありがとう、カシール

4

2 に答える 2

4

オブジェクトが Hibernate エンティティである場合、そもそも 2 つのスレッドが同じオブジェクトへの参照を持つべきではありません。

各スレッドには独自の Hibernate セッションがあり、各セッションにはエンティティの独自のコピーがあります。エンティティに で注釈が付けられたフィールドがある場合@Version、楽観的ロックの場合、スレッドの 1 つで OptimisticLockException が発生します。それ以外の場合は、すべてがうまくいき、最後にコミットしたスレッドが優先されます。

于 2012-11-14T07:52:30.643 に答える
2

回答ありがとうございます。以下は観察と分析後のコメントです

  1. クエリで where 句を使用して条件付き更新を実行し、executeUpdate() メソッドを使用することもできます。例: Hibernate - Query - executeUpdate() メソッドが更新され、更新されたエンティティの数が返されます。したがって、executeUpdate() が「ゼロ」を返す場合、その行は別のスレッドによって既に更新されていることを意味します。(例外なし)

  2. @Version を使用します。(OptimisticLockException)

  3. 行レベル DB ロックの使用。(DB例外)

  4. 同期の使用。(Java 同期例外)

于 2012-11-15T05:57:59.287 に答える