NHibernate와 트랜잭션을 사용하는 경우 Session.Flush()를 사용하지 말고 대신 session.flush()를 내부적으로 호출하는 transaction.Commit()를 사용하십시오.
Commit() 중에 오류가 발생하여 트랜잭션을 롤백해야하는 경우이 문제를 해결할 수 있습니다.
public static void CommitChanges()
{
ITransaction transaction = Session.BeginTransaction();
try
{
transaction.Commit();
}
catch (HibernateException ex)
{
transaction.Rollback();
//close and dispose session here
throw ex;
}
finally
{
transaction.Dispose();
}
}
이제
, 수동 호출 플러시하는 경우() 또는 전화 커밋()는 성공적으로 NHibernate에 메커니즘을 사용하여 트랜잭션을 롤백 할 수있는 방법이 없다 통해 간다. 특히 transaction.Commit() 명령을 호출 할 때 NHibernate에 의해 생성 된 AdoTransaction은 Commit()이 완료된 직후 처리되므로 롤백하기 위해 액세스 할 수 없습니다.
위 코드 샘플을 사용하면 커밋 중에 발생한 오류를 catch 한 다음 이미 시작한 트랜잭션을 롤백 할 수 있습니다.
위의 샘플에서 transaction.Commit()를 호출하는 대신 내 테스트에서 session.Flush()를 호출하면 트랜잭션이 커밋되지 않으므로 데이터가 데이터베이스에 저장되지 않습니다.
코드가 어떻게 보이는지는 모르겠지만 패턴을 호출하는 경우 위의 코드 샘플에서와 같이 Session.Flush() 대신 transaction.commit()을 사용하면 당신이 원하는 것을 성취하십시오.
왜 내가 downvote 알려주십시오? 현재 답변은 좋지만 문제를 해결하지는 않습니다. NHibernate가 아닌 관리 쿼리가 NHibernate에 의해 업데이트 된 데이터에 액세스 할 수 있도록 데이터베이스에 플러시 할 수 있어야합니다. flush를 호출 할 수 없다면, NHibernate가 아닌 관리 쿼리가 데이터에 액세스 할 수있는 다른 방법은 없을까요? 상상해보십시오. 간단한 System.Data.SqlClient 호출로이 작업을 직접 처리 할 수 있습니다. 매우 간단합니다. SqlCommand.ExecuteUpdate() 호출을 TransactionScope에서 랩핑하면 그게 전부입니다. 트랜잭션을 중첩하거나 롤백 할 수 있으며 모든 것이 예상대로 작동합니다. – cbp