Оптимистическая блокировка в спящем режиме по умолчанию

У меня есть один вопрос об оптимистической блокировке в 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

Я думаю, этого достаточно, чтобы ответить на исходный вопрос.