В чем разница между PESSIMISTIC_READ и PESSIMISTIC_WRITE в JPA? - PullRequest
44 голосов
/ 01 ноября 2009

Я прочитал статью Блокировка и параллелизм в Java Persistence 2.0 и запустил пример приложения. Но я все еще не могу понять разницу между PESSIMISTIC_READ и PESSIMISTIC_WRITE. Я попытался изменить код, и где код с использованием PESSIMISTIC_READ и PESSIMISTIC_WRITE будет иметь тот же результат, что SQL будет вызываться с «для обновления».

Ответы [ 4 ]

43 голосов
/ 12 декабря 2013

Разница заключается в запирающем механизме.

PESSIMISTIC_READ блокировка означает, что грязное чтение и неповторяемое чтение невозможны, если у вас есть такая блокировка. Если данные должны быть изменены, необходимо получить PESSIMISTIC_WRITE lock

PESSIMISTIC_WRITE блокировка гарантирует, что помимо грязного и неповторяемого чтения невозможно обновить данные без получения дополнительных блокировок (и возможно 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       ║
╚══════════════════════╩══════════════════════════╩══════════════════════════╝

Ресурсы:

JPA 2,1

22 голосов
/ 01 ноября 2009

Один - это блокировка чтения, а другой - блокировка записи, или во время чтения или обновления, соответственно.

FTA:

  • PESSIMISTIC_READ. Менеджер сущностей блокирует сущность, как только транзакция читает это. Замок есть удерживается до завершения транзакции. Этот режим блокировки используется, когда вы хотите запрашивать данные с помощью repeatable-read семантика. Другими словами, вы хотите чтобы убедиться, что данные не обновляется между последовательными чтениями. Этот режим блокировки не блокирует другие транзакции с чтения данных.

    PESSIMISTIC_WRITE. Менеджер сущностей блокирует сущность, как только транзакция обновляет его. Этот замок режим заставляет сериализацию среди транзакции, пытающиеся обновить данные объекта. Этот режим блокировки часто используется, когда есть высокая вероятность сбой обновления среди одновременных обновление транзакций.

13 голосов
/ 25 октября 2016

PESSIMISTIC_READ получает общую (чтение) блокировку для связанной записи строки таблицы, в то время как PESSIMISTIC_WRITE получает эксклюзивную (запись) блокировку.

Совместная блокировка блокирует любые другие одновременные запросы исключительной блокировки, но позволяет другим запросам общей блокировки продолжаться.

Эксклюзивная блокировка блокирует как общие, так и эксклюзивные запросы блокировки.

Следует отметить, что для Hibernate, если база данных не поддерживает общие блокировки (например, Oracle), тогда запрос общей блокировки (PESSIMISTIC_READ) просто получит запрос эксклюзивной блокировки (PESSIMISTIC_WRITE).

Для получения более подробной информации, прочитайте эту статью о блокировках и эту статью о JPA пессимистичных типах блокировок .

5 голосов
/ 19 декабря 2012

Спецификация позволяет реализации JPA использовать разные типы блокировки базы данных для каждого. Большинство баз данных имеют только один тип декларативной блокировки, поэтому в большинстве реализаций они идентичны (разницы нет).

...