Чтобы ответить на первый вопрос: да, возможно иметь несколько транзакций за один сеанс.
Это хорошая идея?Это зависит.
Проблема заключается в том, что изменение данных в первой транзакции будет зафиксировано, хотя неясно, будет ли завершена вся единица работы (сеанс) в конце.Когда вы получите, скажем, исключение StaleObjectException в более поздней транзакции, вы уже зафиксировали некоторые данные.Обратите внимание, что такое исключение делает вашу сессию непригодной для использования, и вам все равно пришлось ее уничтожить.Тогда трудно начать все сначала и повторить попытку.
Я бы сказал, это хорошо работает при следующих обстоятельствах:
- Это приложение пользовательского интерфейса
- Изменениятолько в последней транзакции.
Приложение пользовательского интерфейса
Ошибки обрабатываются пользователем в интерактивном режиме.Это означает, что пользователь может видеть, что на самом деле хранится в случае ошибки, и повторяет сделанные им изменения.
Изменения сбрасываются только в последней транзакции
Сеанскак реализовано NH только сбрасывает изменения в конце или «когда необходимо».Так что было бы возможно сохранить изменения в памяти, пока сеанс не будет зафиксирован.Проблема в том, что NH должен очищать сессию перед каждым запросом, что сложно контролировать.Его можно отключить, что приводит к побочным эффектам.При написании простых транзакций вы можете контролировать это.В сложной системе практически невозможно убедиться, что все в порядке.
The Simple Way (tm)
Я написал слой постоянства довольно крупного клиентасистемаВ такой системе пользователь не обрабатывает ошибки напрямую.Вам необходимо обработать ошибки в системе и вернуть управление клиенту в согласованном состоянии.
Я упростил всю обработку транзакций до абсолютного минимума, чтобы сделать ее стабильной и «защищенной от идиотов».У меня всегда есть сеанс и транзакция, созданная вместе, и она либо фиксируется, либо нет.