2013-03-14 1 views
1

모두,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); 
    } 
} 

분명히, 내가 뭔가를 놓친 거지.

답변

2

가비지 컬렉터가 객체가 Dispose 주위에 올 때 당신이 점에서, 거래 자체가 오류가 발생했습니다 경우가있을 수는 using 블록의 일환으로 CommitTransaction 직접 전화를 해야하는 것이이 아이디어 예를 들어, Dispose이 그것을 커밋하는 것을 원하지 않는다면, 그냥 처분하고 싶을 것입니다.

+0

그렇다면 using 문에서 'tx.Commit()'를 호출 할 때 try/catch를 사용하는 것이 좋습니다. tx가 커밋시 예외를 throw하면 사용중인 statment는 tx.Dispose(); (트랜잭션 내부 인 경우) 롤백을 수행하고 정리해야합니다. – ActiveX

+0

가능한 경우 언제든지 사용 명세서를 거래에 적용해야한다고 말합니다. 일반적으로 트랜잭션 객체의 Commit()을 using 문에서 마지막으로 호출합니다. 그렇게하면 예외가 발생할 경우 커밋을 피할 수 있습니다. 이것을 위해 try-catch를 사용할 필요가 없습니다. –

+0

좋아요, 그건 완벽하게 이해가됩니다. – ActiveX