JPAメソッドEntityManager#lockは、メモリ内の管理対象エンティティインスタンスに即座に影響しますか、それともセマンティクスをオンデマンドでDBにルーティングしますか?
EntityManager#lockを使用したロックは、悲観的なロックタイプのいずれかを使用した場合にのみ即時に実行されます。
ペシミスティックロックタイプを使用すると、ロック命令がDBにルーティングされ、ロックが成功するかタイムアウトに達するまで待機します。したがって、呼び出しはブロックされ、成功しなかった場合、トランザクションはロールバックされます。
インメモリオブジェクトへの即時の影響は間接的ですが、即時です。ロックが取得されない場合、トランザクションはロールバックされ、トランザクションを正常に終了することはできません。この後、エンティティオブジェクトは永続化されないため、変更しても意味がありません。ただし、理論的には、LockTimeoutExceptionをキャッチすれば、他のプレーンJavaオブジェクトと同様にエンティティオブジェクトを変更して操作することができますが、これはお勧めしません。
楽観的ロックを使用する場合、その性質上、トランザクションは衝突が検出された後にのみロールバックされます。これは、エンティティがDBに永続化される瞬間にのみ発生する可能性があります(通常はトランザクションの終了時に発生しますが、中間フラッシュ中にも発生する可能性があります)。楽観的ロックのポイントは、衝突が発生したことが明らかな後の瞬間にロックを延期することです。
JPAロックメカニズムに関する非常に優れたドキュメントは、この「JPAでのロック」ページにあります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加