Как "вылечить" спящий режим

Можно ли исцелить исключения, возникающие при сохранении / фиксации сеанса гибернации?

Фон: в настоящее время мы обновляем несколько сотен записей за сеанс, используя FluentNHibernate. Время от времени возникает исключение StaleException, поскольку одна из записей была изменена другими процессами. Я вижу, что исключение дает мне идентификатор записи, которая вызвала проблемы, поэтому теоретически я мог бы попытаться выселить / перезагрузить объект и попробовать модифицировать объект снова, вместо того, чтобы откатить всю транзакцию гибернации.

Будет ли это работать при попытке вызова Commit во второй раз, или сеанс станет недействительным из-за сгенерированного исключения?

2 ответа

После того, как у вас есть исключение, вам не повезло. Вам нужно перезагрузить с новым сеансом.

Оптимистическая блокировка хороша, если сбои версий редки. Если нет, вы должны сделать их редкими. Вероятно, у вас есть больше пользователей, редактирующих одну и ту же запись: например, вы можете пометить запись как редактируемую, установив временную метку в тот момент, когда один пользователь открывает ее для редактирования. Отметка времени будет установлена ​​на now+X minutes, Если придет второй пользователь и отметка времени не будет в прошлом, вы увидите ему предупреждение о том, что кто-то еще редактирует.

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

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

Кажется, то, что я пытался сделать, невозможно; Вы должны использовать новый сеанс, если происходит какое-либо исключение при сбросе в базу данных...

https://ayende.com/blog/3946/nhibernate-mapping-concurrency

Выдержка: "Если обновление завершится неудачно из-за того, что строка была обновлена, мы получим исключение StaleObjectException. Как и все исключения, это сделает сеанс непригодным для использования, и вам придется создать новый сеанс для его обработки".

Мне придется изменить дизайн моего процесса, чтобы обрабатывать каждую запись с назначенным сеансом.

Другие вопросы по тегам