2017-11-02 9 views
3

클래스 C에서 A(), B() 및 mainFunction()이라는 메소드가 있다고 가정하십시오. mainFunction()에서 A()와 B() 메소드를 모두 실행해야하지만 둘 다 beginTransaction() 및 commitTransaction(). B()에서 오류가 발생하면 A()의 트랜잭션은 여전히 ​​커밋되거나 아닌가? 그렇다면이 문제를 어떻게 해결할 수 있습니까? 미리 감사nHibernate에서 중첩 된 트랜잭션을 관리하기

public class C 
    { 
     public void A() 
     { 
      //beginTransaction 
      //functions 
      //commitTransaction 
     } 
     public void B() 
     { 
      //beginTransaction 
      //functions 
      //commitTransaction 
     } 

     public void mainFunction() 
     { 
      A(); 
      B(); 
     } 
    } 
+0

[NHibernate에서 중첩 트랜잭션을 수행하는 방법은 무엇입니까?] (https://stackoverflow.com/questions/1192111/how-do-i-do-nested-transactions-in-nhibernate) – Najera

답변

2

에서이 작업을 수행 할 수 있습니다

public void A(ISession objSession) 
    { 
     //functions 
    } 
    public void B(ISession objSession) 
    { 
     //functions 
    } 

    public void mainFunction() 
    { 
     ISession objSession = base.GetCurrentSession; 
     using (ITransaction transaction = objSession.BeginTransaction) 
     { 
     try 
     { 
      A(objSession); 
      B(objSession); 

      //If successful for everything: 
      objSession.Flush(); 
      objSession.Commit(); 
     } 
     catch (Exception ex) 
     { 
      transaction.Rollback(); 
     } 
    } 

는 기본적으로 나는 mainFunction 글로벌 변수로 ISession을했다. 그런 다음 Function A 또는 Function B에서 오류를 발견하면 데이터베이스에 변경 사항을 저장하지 않고 트랜잭션을 롤백 할 수 있습니다.

커밋 트랜잭션을 호출하지 않으면 데이터베이스에 변경 사항을 저장하지 않고 기능 A 또는 기능 B 내에 ISession.Evict 또는 ISession.Update을 사용할 수 있습니다.

여기서 생각한 바는 트랜잭션을 함수 A와 B 외부에 두어 트랜잭션 롤백을 호출 할 수 있다는 것입니다.

+0

죄송하지만 모든 기능을 시작하고 커밋해야하며 중첩 된 트랜잭션을 수행해야합니다. 나는 nHibernate의 beginTransaction()과 commitTransaction()을 오버라이드하여 카운터를 구현하고 그것이 마지막 commitTransaction인지 점검 할 수 있다고 생각한다. 그렇다면 전체 트랜잭션 만 커밋하십시오. 그러나 어느 클래스를 오버라이드 할 것인가? 나는 혼란 스럽다. –

+0

나는 이해한다. 그러나 함수 B가 오류를 트리거하는 경우 롤백을 원하십니까? 그렇다면 글로벌화하지 않겠습니까? 그러나 그것은 제 제안입니다. –

+0

이 dataAccessLayer를 한 번 살펴 보시기 바랍니다. 일반적인 오류가 많이 있지만 그 세 가지 방법을보고 나에게 제안 해 주시겠습니까? ** https : //codereview.stackexchange.com/questions/179334/dataaccesslayer-of-nhibernate/179346#179346** –