때때로 ISession
ADO.NET 연결 상태를 메모리에 보유 된 객체의 상태와 동기화하는 데 필요한 SQL 문을 실행합니다. 이 프로세스 플러시는 기본적으로 다음 지점에서 발생합니다.
Find()
또는 일부 호출에서Enumerable()
- ...에서
NHibernate.ITransaction.Commit()
- ...에서
ISession.Flush()
SQL 문은 다음 순서로 발행됩니다.
- 모든 개체 삽입 (해당 개체를 사용하여 해당 개체를 저장 한 순서와 동일)
ISession.Save()
- 모든 엔티티 업데이트
- 모든 컬렉션 삭제
- 모든 컬렉션 요소 삭제, 업데이트 및 삽입
- 모든 컬렉션 삽입
- 모든 개체 삭제 (해당 개체를 사용하여 해당 개체를 삭제 한 순서와 동일)
ISession.Delete()
(단, 고유 ID 생성을 사용하는 객체는 저장할 때 삽입됩니다.)
명시적인 경우를 제외하고 Flush()
, 세션이 ADO.NET 호출을 언제 실행하는지에 대한 보장은 없으며, 실행 순서 만 보장 합니다. 그러나 NHibernate는 ISession.Find(..)
메소드가 오래된 데이터를 리턴하지 않을 것이라고 보장한다 . 또한 잘못된 데이터를 반환하지도 않습니다.
플러시가 덜 자주 발생하도록 기본 동작을 변경할 수 있습니다. 이 FlushMode
클래스는 커밋시에만 플러시 (및 NHibernate ITransaction
API가 사용되는 경우에만 ), 설명 된 루틴을 사용하여 자동으로 플러시 또는 Flush()
명시 적으로 호출 되지 않는 한 플러시하지 않는 세 가지 모드를 정의합니다 . 마지막 모드는 장시간 실행중인 작업 단위에 유용합니다 ISession
.
...
세션을 종료하는 데는 4 가지 단계가 있습니다.
- 세션을 플러시
- 거래를 저 지르다
- 세션을 닫다
- 예외 처리
세션 플러시
ITransaction
API를 사용하는 경우이 단계에 대해 걱정할 필요가 없습니다. 트랜잭션이 커밋되면 암시 적으로 수행됩니다. 그렇지 않으면 ISession.Flush()
모든 변경 사항이 데이터베이스와 동기화되도록 호출해야 합니다.
데이터베이스 트랜잭션 커밋
NHibernate ITransaction API를 사용하는 경우 다음과 같습니다.
tx.Commit(); // flush the session and commit the transaction
ADO.NET 트랜잭션을 직접 관리하는 경우 ADO.NET 트랜잭션을 수동으로 Commit()
수행 해야 합니다.
sess.Flush();
currentTransaction.Commit();
변경 사항을 커밋하지 않기로 결정한 경우 :
tx.Rollback(); // rollback the transaction
또는:
currentTransaction.Rollback();
트랜잭션을 롤백하면 NHibernate의 내부 상태가 일관성을 유지하도록 현재 세션을 즉시 닫고 버려야합니다.
문제 종결
ISession.Close()
세션 종료 를 표시하기 위한 호출 . Close ()의 주요 의미는 세션에 의해 ADO.NET 연결이 포기된다는 것입니다.
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
고유 한 연결을 제공 한 경우 Close()
참조를 리턴하므로 수동으로 닫거나 풀로 리턴 할 수 있습니다. 그렇지 않으면 Close()
풀로 반환합니다.