2011-07-07 7 views
1

私はEclipse Link実装を使用していますが、これはHibernateにも関係している可能性があります。 は、いくつかの時点で私はと呼ばれる:私はアトミック操作として考えJPAロックはアトミックと見なされますか?

em.lock(entity, LockModeType.OPTIMISTIC_FORCE_INCREMENT);

を。

驚いたことに、@Versionフィールドにブレークポイントを設定した後、entity._persistence_getentity._persistence_setに多くの呼び出しがあるようです。

明らかに、2つのブラウザを使用してデバッガで同じポイントに到達し、それらの隠し機能を実行している間にスレッド間を切り替えることは可能です。これが完了すると、両方のスレッドが後でフラッシュ/コミットすることは不可能です。

リリースモードではないとき、またはデバッガだけが原因で変更が発生しますか?

よろしく、 ダニエル

+0

質問がわかりません。あなたは原子で何を意味しますか?添付エンティティは、複数のスレッドで使用されることは想定されていません。 –

+0

原子=操作中にコンテキストスイッチが許可されていません。 – Daniel

答えて

0

Javaでコンテキストスイッチをないようにする方法(私の知る限りでは)ありません。したがって、この意味でのロックがどのようにアトミックになるかはわかりません。しかし、なぜか関係するエンティティが複数のスレッドによって同時に使用されることは想定されていないため、どうして重要なのかわかりません。

+0

これを防ぐ方法はありますか? 2人のユーザーが同じフィールドを同時に更新しようとしている場合、どのようにしてそれが起こらないようにすることができますか?私はロックが唯一の解決策だと思った。 – Daniel

+0

ロックはデータベース**の行**の同時変更を防ぐために使用されます。スレッドとはまったく関係ありません.2つのトランザクションが2つの異なるJVM上で実行されている可能性があります。ロックによって引き起こされたバージョンフィールドのインクリメントにより、2つの並行トランザクションの1つがロールバックされ、例外が発生します。しかし、スレッドコンテキストの切り替えはメカニズムに影響を与えません。説明については、http://blogs.oracle.com/carolmcdonald/entry/jpa_2_0_concurrency_andを参照してください。 –

関連する問題