58

記事Locking and Concurrency in Java Persistence 2.0を読み、サンプル アプリケーションを実行しました。しかし、私はまだ と の違いを理解できませPESSIMISTIC_READPESSIMISTIC_WRITEPESSIMISTIC_READコードを変更しようとしましたが、とを使用したコードはPESSIMISTIC_WRITE、 SQL が で呼び出したのと同じ結果になりますfor update

4

5 に答える 5

54

違いはロック機構にあります。

PESSIMISTIC_READlock は、そのようなロックがある場合、ダーティ リードと反復不可能なリードが不可能であることを意味します。データを変更する必要がある場合は、PESSIMISTIC_WRITEロックを取得する必要があります

PESSIMISTIC_WRITElock は、ダーティで反復不可能な読み取りが不可能であることに加えて、追加のロックを取得せずにデータを更新できることを保証します (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       ║
╚══════════════════════╩══════════════════════════╩══════════════════════════╝

資力:

JPA2.1

于 2013-12-11T23:51:41.120 に答える
29

1 つは読み取りロック、もう 1 つは書き込みロック、またはそれぞれ読み取り中または更新中です。

FTA:

  • PESSIMISTIC_READ。エンティティ マネージャは、トランザクションがエンティティを読み取るとすぐにエンティティをロックします。ロックは、トランザクションが完了するまで保持されます。このロック モードは、反復可能な読み取りセマンティクスを使用してデータをクエリする場合に使用されます。つまり、連続する読み取り間でデータが更新されないようにする必要があります。このロック モードは、他のトランザクションによるデータの読み取りをブロックしません。

    PESSIMISTIC_WRITE。エンティティ マネージャは、トランザクションがエンティティを更新するとすぐにエンティティをロックします。このロック モードは、エンティティ データを更新しようとするトランザクション間でシリアル化を強制します。このロック モードは、同時更新トランザクション間で更新が失敗する可能性が高い場合によく使用されます。

于 2009-11-01T13:22:32.167 に答える
5

この仕様では、JPA実装がそれぞれに異なるタイプのデータベースロックを使用できるようになっています。ほとんどのデータベースには1種類の宣言型ロックしかないため、ほとんどの実装では2つは同一です(違いはありません)。

于 2012-12-19T15:11:32.397 に答える