7

EntityManager.lock(entity, LockModeType.READ) を呼び出すことの影響を理解しようとしています。API ドキュメントは、私にとって非常にわかりにくいように思えます。

同時スレッドが必要で、スレッド 1 が lock(entity, LockModeType.READ) を呼び出した場合、スレッド 2 は引き続きエンティティを読み書きできますか?

これまでに学んだこと:

JPA1 のロック・タイプ READ は、JPA2 の OPTIMISTIC と同じです。このようなロックが設定されている場合、EntityManager はトランザクションをコミットする前にバージョン属性をチェックしますが、更新はしません。OPTIMISTIC ロック モードの説明を見つけました: Link。OPTIMISTIC (READ) LockMode Example を検索します。私がこれを理解している限り、スレッド 1 で読み取りロックを設定しても、スレッド 2 ... n には影響しません。他のすべてのスレッドは、引き続きエンティティの読み取りと書き込みを行うことができます。ただし、スレッド 1 のトランザクションがコミットされ、別のスレッドがエンティティを更新すると、スレッド 1 のトランザクションはロールバックされます。

私はこれを正しく理解していますか?

4

1 に答える 1

4

いずれにしても読み取りは現在推奨されていませんが、理解のために:

READ ロックを使用すると、コミット時にオブジェクトの状態が変更されないことが保証されます。これは、READ ロックにより、他のトランザクションがオブジェクトを更新または削除できるためです。その後、スレッド 1 が何らかの変更を行ってからコミットすると、最初にオブジェクトの状態 (バージョン) がチェックされます。エンティティをチェックする場合はコミットされ、そうでない場合は許可されません。

基本的にあなたの理解は正しいです。

それを使用する最新の方法であるOPTIMISTIC_READもあります(_WRITEもあります)。

アップデート

この記事は、これが役立つことを理解するのに大いに役立ちました。

于 2012-04-18T21:08:30.387 に答える