悲観的ロックを可能にする JPA 2.0 の EclipseLink 実装を使用しています。エンティティをロックする方法は知っていますが、ロックを解除するにはどうすればよいですか? 最初は、これはすべてトランザクション内で処理される (つまり、トランザクションをコミットするまでエンティティがロックされる) と思っていましたが、そうではないようです。
私は簡単なグーグル検索を試みました(これはかなり明白であるように思われます)が、何も見つかりませんでした...
悲観的ロックを可能にする JPA 2.0 の EclipseLink 実装を使用しています。エンティティをロックする方法は知っていますが、ロックを解除するにはどうすればよいですか? 最初は、これはすべてトランザクション内で処理される (つまり、トランザクションをコミットするまでエンティティがロックされる) と思っていましたが、そうではないようです。
私は簡単なグーグル検索を試みました(これはかなり明白であるように思われます)が、何も見つかりませんでした...
睡眠をとった後...そして朝にさらにテストを行った後、私は自分の問題を理解したと信じています.
したがって、ロックは実際にはtaken care of within a transaction
. ただし、コードをテストしていたときに、EntityManager.find(Class, key)
メソッドを使用してロックされた行を取得できました (ロック戦略は指定されていません)。
行にロックをかけると、行を読み取れないと誤って考えました。ただし、 JPA のPESSIMISTIC_READ
andの定義を読み直しPESSIMISTIC_WRITE
、問題に気付きました。
PESSIMISTIC_READ - エンティティはデータベース上でロックされており、他のトランザクションがPESSIMISTIC_WRITE ロックを取得するのを防ぎます。 PESSIMISTIC_WRITE - エンティティはデータベース上でロックされており、他のトランザクションがPESSIMISTIC_READ または PESSIMISTIC_WRITE ロックを取得するのを防ぎます。
ロックは必ずしもすべての読み取りを防止するわけではなく、別のトランザクションが行に を配置するのを防止するだけですREAD or WRITE lock
。