Оптимистическая блокировка в спящем режиме по умолчанию
У меня есть один вопрос об оптимистической блокировке в Hibernate. Я пытаюсь проникнуть в оптимистичную блокировку с Hibernate, но у меня есть одно сомнение. Hibernate использует подход к версии (целое или временную метку) для реализации оптимистической блокировки. Для настройки вы можете использовать аннотацию @Version (или конфигурацию xml) и создать атрибут версии. Другой вариант настраивается без использования версий с использованием атрибута optimistic-lock = "all".
Мой вопрос в том, что вы не определяете какой-либо атрибут управления версиями, а также не указываете атрибут optimistic-lock, какая стратегия использует Hibernate в этом случае? Pessimistc Locking Я уверен, что нет, поэтому я полагаю, что это оптимистичная блокировка, но не знаю, как это сделать.
Большое спасибо за внимание.
Ответы
Ответ 1
Если вы не настроили Hibernate для использования оптимистической блокировки, он вообще не использует блокировку. Итак, в этом случае всегда выигрывает последнее обновление.
Чтобы это было ясно, обратите внимание, что оптимизационная блокировка Hibernate полностью отличается от изоляции транзакций СУБД. Оптимистическая блокировка Hibernate работает только в ситуации, когда вы загружаете объект в одну транзакцию, изменяете ее и сохраняете позже в другой транзакции. В этом случае оптимистическая блокировка гарантирует, что какая-либо другая транзакция не изменила этот объект в базе данных между ними. Однако оптимистическая блокировка не влияет на изоляцию параллельных транзакций, поэтому блокировки (оптимистичные или пессимистические), используемые СУБД внутренне для реализации изоляции транзакций, по-прежнему работают независимо от того, включена ли блокировка Hibernate или нет.
Ответ 2
@axtavt, вы правы, но вопрос о том, как hibernate реализовать оптимистичную блокировку без столбца @Version
.
Сегодня доступны четыре доступных OptimisticLockType
варианта:
/**
* Perform no optimistic locking.
*/
NONE,
/**
* Perform optimistic locking using a dedicated version column.
*
* @see javax.persistence.Version
*/
VERSION,
/**
* Perform optimistic locking based on *dirty* fields as part of an expanded WHERE clause restriction for the
* UPDATE/DELETE SQL statement.
*/
DIRTY,
/**
* Perform optimistic locking based on *all* fields as part of an expanded WHERE clause restriction for the
* UPDATE/DELETE SQL statement.
*/
ALL
Я думаю, этого достаточно, чтобы ответить на исходный вопрос.