2012-05-01 3 views
3

Я использую весенний mvc 3.0 и спящий режим. Я здесь, как, у меня есть инвентарь, где пользователь может добавлять и удалять элементы. Например, общее количество = 50. Теперь два пользователя одновременно хотят обновить инвентарь, например, 2 элемента, удаленные A и 4 элемента, удаленные B. Таким образом, общее количество = 44. Теперь, как я могу выполнить эту транзакцию, когда оба пользователя пытаются одновременно обновить инвентарь ?? Если транзакция не поддерживается, она будет равна 50-2 = 48, а затем 50-4 = 46.сделка весна mvc и hiberante

ответ

-1

Вы можете использовать оптимистичную блокировку с управлением версиями. Оптимистическая блокировка с версией включена, как только вы добавляете или свойство к постоянному сопоставлению классов. отображение свойства в XML должно быть размещено сразу после отображения идентификатора недвижимости:

<class name="Item" table="ITEM"> 
    <id .../> 
    <version name="version" access="field" column="OBJ_VERSION"/> 
    ... 
</class> 

с этим, когда элемент обновляются, то SQL будет:

update ITEM set INITIAL_PRICE='12.99', OBJ_VERSION=2 
where ITEM_ID=123 and OBJ_VERSION=1 

Если другая одновременно единица работы обновляется и зафиксировал ту же строку, столбец OBJ_VERSION больше не содержит значение 1, а строка не обновляется. Hibernate проверяет количество строк для этого оператора, возвращаемое драйвером JDBC , который в этом случае представляет собой количество обновленных строк, ноль и генерирует StaleObjectStateException.

Если у вас нет версии или временных меток столбцов, Hibernate все еще может выполнять автоматическую управления версиями, но только для объектов, которые извлекаются и модифицированными в том же контексте инерционности (то есть, та же сессия). Эта альтернативная версия управления версиями проверяет текущую базу данных на соответствие неизмененным значениям постоянных свойств во время восстановления объекта (или в последний раз, когда контекст сохранения был сброшен). Вы можете включить эту функцию, установив атрибут оптимистических блокировок на отображении класса :

<class name="Item" table="ITEM" optimistic-lock="all"> 
<id .../> 
... 
</class> 

Следующая SQL теперь выполняется промывать модификацию экземпляра товара: обновления Комплект ITEM_PRICE = '12 .99' где ITEM_ID = 123 и ITEM_PRICE = «9,99» и ITEM_DESCRIPTION = «Элемент,» и ... и SELLER_ID = 45

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

Более подробную информацию вы можете найти в книге «Java Persistent with Hibernate» от CHRISTIAN BAUER и GAVIN KING. (Рекомендуется)

EDIT: Ryan is right. Я исправляю свой ответ.

+1

Это неверно. Hibernate по умолчанию оптимизирует блокировку, поэтому он не будет «просто работать». –

+0

@ Райан Стюарт, что вы подразумеваете под оптимистичной блокировкой ?? может у объяснить немного ?? – curiouss

+0

Я ищу оптимистичную блокировку и обнаружил, что: Оптимистичный подход всегда предполагает, что все будет в порядке и что конфликтующие изменения редки. Оптимистичный контроль параллелизма вызывает ошибку только в конце единицы работы, когда данные записываются. Многопользовательские приложения обычно по умолчанию используют оптимистичный контроль параллелизма и подключения к базе данных с уровнем изоляции с фиксацией чтения. Дополнительные гарантии изоляции получаются только в случае необходимости; например, когда требуется повторное считывание. Этот подход обеспечивает наилучшую производительность и масштабируемость. – Jacky

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