Время от времени ISession
будет выполнять операторы SQL, необходимые для синхронизации состояния соединения ADO.NET с состоянием объектов, хранящихся в памяти. Этот процесс, очистка, происходит по умолчанию в следующих точках
- из некоторых вызовов
Find()
или Enumerable()
- из
NHibernate.ITransaction.Commit()
- от
ISession.Flush()
Операторы SQL выдаются в следующем порядке
- все вставки объектов, в том же порядке соответствующие объекты были сохранены с использованием
ISession.Save()
- все обновления сущностей
- все удаления из коллекции
- все удаления, обновления и вставки элементов коллекции
- все коллекции вставок
- все удаления сущностей, в том же порядке соответствующие объекты были удалены с помощью
ISession.Delete()
(Исключением является то, что объекты, использующие генерацию собственных идентификаторов, вставляются при сохранении.)
За исключением случаев, когда вы расширили Flush()
, нет абсолютно никаких гарантий относительно того, когда Session выполняет вызовы ADO.NET, только порядок, в котором они выполняются . Однако NHibernate гарантирует, что методы ISession.Find(..)
никогда не будут возвращать устаревшие данные; и при этом они не будут возвращать неправильные данные.
Можно изменить поведение по умолчанию, чтобы сброс происходил реже. Класс FlushMode
определяет три различных режима: только очистка во время фиксации (и только при использовании API NHibernate ITransaction
), автоматическая очистка с использованием объясненной процедуры или никогда не очистка, если явно не вызывается Flush()
. Последний режим полезен для длительных единиц работы, где ISession
остается открытым и отключенным в течение длительного времени.
...
Завершение сеанса включает четыре отдельных этапа:
- очистить сеанс
- совершить транзакцию
- закрытие сессии
- обработка исключений
Очистка сессии
Если вы используете API ITransaction
, вам не нужно беспокоиться об этом шаге. Это будет выполнено неявно, когда транзакция будет зафиксирована. В противном случае вам следует вызвать ISession.Flush()
, чтобы убедиться, что все изменения синхронизированы с базой данных.
Подтверждение транзакции базы данных
Если вы используете API-интерфейс NHibernate ITransaction, это выглядит следующим образом:
tx.Commit(); // flush the session and commit the transaction
Если вы управляете транзакциями ADO.NET самостоятельно, вам следует вручную Commit()
транзакцию ADO.NET.
sess.Flush();
currentTransaction.Commit();
Если вы решили не фиксировать свои изменения:
tx.Rollback(); // rollback the transaction
или
currentTransaction.Rollback();
Если вы откатываете транзакцию, вы должны немедленно закрыть и отменить текущий сеанс, чтобы убедиться, что внутреннее состояние NHibernate согласовано.
Закрытие ISession
Вызов ISession.Close()
отмечает конец сеанса. Основное значение Close () заключается в том, что соединение ADO.NET будет прервано сессией.
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
Если вы указали свое собственное соединение, Close()
возвращает ссылку на него, поэтому вы можете вручную закрыть его или вернуть в пул. В противном случае Close()
возвращает его в пул.