2012-04-12 2 views
11

У меня есть один вопрос об оптимистичной блокировке в спящем режиме. Я пытаюсь проникнуть в оптимистичную блокировку с Hibernate, но у меня есть одно сомнение. Hibernate использует подход к версии (целое или временную метку) для реализации оптимистической блокировки. Для настройки вы можете использовать аннотацию @Version (или конфигурацию xml) и создать атрибут версии. Другой вариант настраивается без использования версий с использованием атрибута optimistic-lock = "all".Оптимистическая блокировка в спящем режиме по умолчанию

Мой вопрос в том, что вы не определяете какой-либо атрибут управления версиями, а также не указываете атрибут optimistic-lock, какая стратегия использует Hibernate в этом случае? Pessimistc Locking Я уверен, что нет, поэтому я полагаю, что это оптимистическая блокировка, но не знаю, как это сделать.

Большое спасибо за внимание.

ответ

33

Если вы не настроили Hibernate для использования оптимистической блокировки, он вообще не использует блокировку. Итак, в этом случае последнее обновление всегда выигрывает.

Для того, чтобы это было ясно, обратите внимание, что оптимизационная блокировка Hibernate полностью отличается от изоляции транзакций СУБД. Оптимистическая блокировка Hibernate работает только в ситуации, когда вы загружаете объект в одну транзакцию, изменяете ее и сохраняете позже в другой транзакции. В этом случае оптимистическая блокировка гарантирует, что какая-либо другая транзакция не изменила этот объект в базе данных между ними. Однако оптимистическая блокировка не влияет на изоляцию параллельных транзакций, поэтому блокировки (оптимистичные или пессимистические), используемые СУБД внутренне для реализации изоляции транзакций, все еще работают, независимо от того, включена ли блокировка Hibernate или нет.

3

@axtavt, вы правы, но вопрос о том, как спящий режим реализовать оптимистичную блокировку без @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 

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

Смежные вопросы