모두,Nhibernate 세션 패턴 읽기/저장, 정확한 트랜잭션 동작은 무엇입니까?
이 사용/쓰기 데이터를 읽는 데 사용되는 패턴이다 세션을 n 형 최대 절전 모드 :
using(var session = factory.OpenSession())
using(var tx = session.BeginTransaction())
{
// all the code that uses the session goes here
// use session to load and/or save entity
}
내 질문은 :
당신이 트랜잭션을 시작, 그것은 데이터베이스 트랜잭션을 시작합니다 연결에 있지만 해당 커밋 문이 표시되지 않습니다. 대신 tx의 using 문은 tx.Dispose()를 호출합니다. n-hibernate 소스 (SqlTransaction 객체를 사용하는 AdoTransaction 클래스에서)를 보면 기본 트랜잭션 객체는 커밋되지 않지만 아래에서 볼 수있는 것처럼 처리됩니다. 그래서 처분하기 전에 SqlTransaction 공급자가 커밋을 호출한다고 가정해야합니까? ado.net 용 SqlClient 공급자를위한 어딘가에있는 문서입니까? 내가 tx.Dispose()가 호출 세션을 플러시 코드를 찾을 수 있기 때문에
if (isDisposing)
{
if (trans != null)
{
trans.Dispose();
trans = null;
log.Debug("IDbTransaction disposed.");
}
if (IsActive && session != null)
{
// Assume we are rolled back
AfterTransactionCompletion(false);
}
}
분명히, 내가 뭔가를 놓친 거지.
그렇다면 using 문에서 'tx.Commit()'를 호출 할 때 try/catch를 사용하는 것이 좋습니다. tx가 커밋시 예외를 throw하면 사용중인 statment는 tx.Dispose(); (트랜잭션 내부 인 경우) 롤백을 수행하고 정리해야합니다. – ActiveX
가능한 경우 언제든지 사용 명세서를 거래에 적용해야한다고 말합니다. 일반적으로 트랜잭션 객체의 Commit()을 using 문에서 마지막으로 호출합니다. 그렇게하면 예외가 발생할 경우 커밋을 피할 수 있습니다. 이것을 위해 try-catch를 사용할 필요가 없습니다. –
좋아요, 그건 완벽하게 이해가됩니다. – ActiveX