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