Оптимистическая блокировка в JPA, как это работает? - PullRequest
0 голосов
/ 27 июня 2018

Я понимаю, что такое оптимистическая блокировка и «как она работает», но я не знаю, как реализовать ее в Java EE.

У меня есть объект в JPA, и я добавляю еще один столбец версия , и я пометил его @Version. Но чтобы иметь оптимистичное управление блокировками, мне нужна только аннотация @Version?

Это мой класс Java:

@Entity
public class MyClass implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
    //other variables
    @Version
    @Column(name = "version")
    private int version;
 //other code
}

В моем проекте я использую сессионный компонент без состояния , чтобы получить доступ к классу сущности и сохранить больше операций, поэтому я использую @TransactionManagement(TransactionManagementType.CONTAINER) по умолчанию для обработки моей транзакции.

Мое сомнение: с @TransactionManagement(TransactionManagementType.CONTAINER) (независимо от того, что такое @TransactionAttribute (ОБЯЗАТЕЛЬНО, ОБЯЗАТЕЛЬНО и т. д.)) и только с аннотированием version переменной в MyClass.java. Я получаю оптимистическое управление блокировками?

1 Ответ

0 голосов
/ 06 июля 2018

С Pro JPA 2: освоение API персистентности Java ™ :

Пару слов предупреждения о полях версии по порядку. Во-первых, не гарантируется, что они будут обновлены как в управляемых объектах, так и в базе данных, как часть операции массового обновления . (...) Второй момент, о котором следует помнить, это то, что поля версии будут автоматически обновляться только тогда, когда поля несвязи или поля отношения внешнего ключа (например, многие-к-одному и один- отношения внешнего ключа к одному источнику) изменены . (...) По умолчанию JPA предполагает (...) Read Committed изоляция. Нормальное выполнение с использованием блокировки версий работает с изоляцией Read Committed для обеспечения дополнительных проверок согласованности данных перед лицом чередующихся записей. Чтобы удовлетворить более жесткие ограничения блокировки , чем то, что предлагает эта блокировка , необходимо использовать дополнительную стратегию блокировки .

(акцент мой)

Итак, чтобы ответить на ваш вопрос: Нет. Использование @Version не охватывает все базы.

Вышеупомянутая дополнительная стратегия блокировки включает передачу соответствующего режима блокировки (OPTIMISTIC или OPTIMISTIC_FORCE_INCREMENT) на EntityManager.lock(), EntityManager.refresh(), EntityManager.find() и Query.setLockMode(), где это применимо. Я не буду вдаваться в подробности и рекомендую читать далее (в книге также есть подробное обсуждение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...