記事Locking and Concurrency in Java Persistence 2.0を読み、サンプル アプリケーションを実行しました。しかし、私はまだ と の違いを理解できませPESSIMISTIC_READ
んPESSIMISTIC_WRITE
。PESSIMISTIC_READ
コードを変更しようとしましたが、とを使用したコードはPESSIMISTIC_WRITE
、 SQL が で呼び出したのと同じ結果になりますfor update
。
5 に答える
違いはロック機構にあります。
PESSIMISTIC_READ
lock は、そのようなロックがある場合、ダーティ リードと反復不可能なリードが不可能であることを意味します。データを変更する必要がある場合は、PESSIMISTIC_WRITE
ロックを取得する必要があります
PESSIMISTIC_WRITE
lock は、ダーティで反復不可能な読み取りが不可能であることに加えて、追加のロックを取得せずにデータを更新できることを保証します (deadlocks
排他ロックを待っている間も可能です)。
╔══════════════════════╦══════════════════════════╦══════════════════════════╗
║ LockModeType ║ PESSIMISTIC_READ ║ PESSIMISTIC_WRITE ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ type ║ SHARED LOCK ║ EXCLUSIVE LOCK ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ isReadOnly without ║ ║ ║
║ additional locks ║ YES ║ NO ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ dirty reads ║ NO ║ NO ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ non-repeatable reads ║ NO ║ NO ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ how to update data ║ obtain PESSIMISTIC_WRITE ║ ALLOWED ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ ║ no one holds ║ no one holds ║
║ how to obtain lock ║ PESSIMISTIC_WRITE ║ PESSIMISTIC_READ or ║
║ ║ ║ PESSIMISTIC_WRITE ║
╠══════════════════════╬══════════════════════════╬══════════════════════════╣
║ ║ ║ when there is a high ║
║ ║ you want to ensure no ║ likelihood of deadlock or║
║ when to use ║ dirty or non-repeatable ║ update failure among ║
║ ║ reads are possible ║ concurrent updating ║
║ ║ ║ transactions ║
╚══════════════════════╩══════════════════════════╩══════════════════════════╝
資力:
1 つは読み取りロック、もう 1 つは書き込みロック、またはそれぞれ読み取り中または更新中です。
FTA:
PESSIMISTIC_READ。エンティティ マネージャは、トランザクションがエンティティを読み取るとすぐにエンティティをロックします。ロックは、トランザクションが完了するまで保持されます。このロック モードは、反復可能な読み取りセマンティクスを使用してデータをクエリする場合に使用されます。つまり、連続する読み取り間でデータが更新されないようにする必要があります。このロック モードは、他のトランザクションによるデータの読み取りをブロックしません。
PESSIMISTIC_WRITE。エンティティ マネージャは、トランザクションがエンティティを更新するとすぐにエンティティをロックします。このロック モードは、エンティティ データを更新しようとするトランザクション間でシリアル化を強制します。このロック モードは、同時更新トランザクション間で更新が失敗する可能性が高い場合によく使用されます。
この仕様では、JPA実装がそれぞれに異なるタイプのデータベースロックを使用できるようになっています。ほとんどのデータベースには1種類の宣言型ロックしかないため、ほとんどの実装では2つは同一です(違いはありません)。