2012-07-03 4 views
0

Предположим, пользователь_1 и user_2 обратились к сотруднику с id = 101, name = Rahul, accountBalance = 1500 в тот же момент. , так что у обоих пользователей есть сотрудник с указанными выше значениями в руке. Пользователь_1 добавил 1000 к accountBalance и обновил сотрудника. поэтому его баланс составляет 2500 сейчас в базе данных.одновременное обновление с hibernate

И сразу же после того, как user_1 обновит сотрудника, user_2 добавит 500 к балансу счета. Таким образом, 500 будет добавлено к балансу счета сотрудника, который сейчас находится в руке user_2. поэтому 1500 + 500 = 2000.

Но, на самом деле это должно быть (1500 + 1000) = +500 3000.

Как эта проблема решается в Java с спящим режимом?

Хотите ли мы снова проверить последнее значение в бизнес-методе updateEmployee() и затем добавить сумму к этой новой учетной записи?

Пожалуйста, помогите мне справиться с этой ситуацией надлежащим образом. спасибо

ответ

2

Вы делаете это, позволяя оптимистичную блокировку, используя поле, аннотированное с помощью @Version. При каждом обновлении Hibernate будет проверять, что версия в базе данных такая же, как и в памяти, и увеличивает версию. Если версии не совпадают, это вызовет исключение.

Подробнее об оптимальной блокировке в the documentation.

+0

ОК. Позвольте мне спросить. я делаю приложение с JSF/primefaces в слое презентации, Spring на бизнес-уровне и спящий режим на уровне доступа к данным. я получаю детали сотрудника в управляемом компоненте employeeEdit через employeeService. employeeService получает объект employee с id = 1 с помощью employeeDao. поэтому, как только оба пользователя будут читать сотрудника таким же образом, баланс учетной записи сотрудника будет отображаться на веб-странице как 1500. После добавления 1000 по user_1 тоже он остается таким же (1500) в представлении user_2 (то есть в резервной копии боб). – amFroz

+0

Итак, каков, как правило, следующий способ обработки такого приложения. user_2 добавляет свой 500 к балансу счета объекта employee (с id = 1), который уже находится в бэк-файле. каково решение – amFroz

+0

Это вопрос aJSF, и я не очень разбираюсь в JSF. Я предполагаю, что бэк-файл хранится в сеансе и, таким образом, отображает устаревшие данные. –

1

Пользователь концепции управления версией Hibernate. В этом случае, если user_2 обновляет одну и ту же запись, спящий режим проверяет, что эта же запись была изменена до обновления, если это так, генерирует исключение. Таким образом, ваше приложение должно обработать это исключение и сообщить user_2 об изменениях в записи и перезагрузить запись еще раз.

+0

Хорошо. Так позвольте мне спросить. я делаю приложение с JSF/primefaces в слое презентации, Spring на бизнес-уровне и спящий режим на уровне доступа к данным. я получаю детали сотрудника в управляемом компоненте employeeEdit через employeeService. employeeService получает объект employee с id = 1 с помощью employeeDao. – amFroz

+0

Итак, каков, как правило, следующий способ обработки такого приложения. user_2 добавляет свой 500 к балансу счета объекта employee (с id = 1), который уже находится в бэк-файле. Каково решение – amFroz

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