У нас есть таблица базы данных SQL Server, которая состоит из идентификатора пользователя, некоторого числового значения, например, баланс и столбец версии.
У нас есть несколько потоков, которые параллельно обновляют столбец значений этой таблицы, каждый в своей транзакции и сеансе (мы используем модель сеанса для потока). Поскольку мы хотим, чтобы все логические транзакции происходили, каждый поток выполняет следующее:
- загрузить текущую строку (сопоставленную с типом).
- внести изменения в значение, основанное на старом значении. (например, добавить 50).
- Session.update (OBJ)
- session.flush () (поскольку мы настроены оптимистично, мы хотим убедиться, что у нас было правильное значение версии до обновления)
- если на шаге 4 (сбросить) возникло исключение StaleStateException, обновить объект (с помощью lockmode.read) и перейти к шагу 1
мы делаем это только определенное количество раз за логическую транзакцию, если мы не можем зафиксировать ее после X попыток, мы отклоняем логическую транзакцию.
каждый такой поток фиксируется периодически, например, после 100 успешных логических транзакций поддерживать ввод-вывод на контролируемом уровне. значение - у нас есть одна транзакция базы данных (на транзакцию) с несколькими сбросами, по крайней мере, один раз за логическое изменение.
в чем здесь проблема, спросите вы? хорошо, при коммитах мы видим изменения в неудачных логических объектах
в частности, если значение было 50, когда мы прошли шаг 1 (впервые), и мы попытались обновить его до 100 (но мы потерпели неудачу, поскольку, например, другой поток изменил его на 70), тогда значение 50 фиксируется для этот ряд очевидно, это неверно.
Чего нам здесь не хватает?