2012-08-14 2 views
0

Castle ActiveRecord v1.0.3을 사용하여 삭제 작업을 수행하려면 다음 코드로 작업하고 있습니다 (레거시!). TransactionMode.Inherits의,이 방법의 소비자들이 자신의 ActiveRecord.TransactionScope이 메소드에 대한 호출을 래핑 할 수 있기 때문에ActiveRecord.TransactionScope가 OnTransactionCompleted 이벤트를 사용하여 성공했는지 여부를 확인하십시오.

public void Delete(anObject instance) 
{ 
    try 
    { 
     using (var scope = new ActiveRecord.TransactionScope(TransactionMode.Inherits, OnDispose.Rollback)) 
     { 
      ...(DB Operations) 

      scope.VoteCommit(); 

      MethodCallBecauseOfSuccess(); 
     } 
    } 
    catch (NHibernate.TransactionException ex) 
    { 
     MethodCallBecauseOfFailure(); 
    } 
} 

문제이다. 그들이 이렇게 할 경우 예외가 범위의 지점에서 발생하지 않습니다 .VoteCommit() 따라서 MethodCallBecauseOfSuccess() 잘못 호출됩니다.

이 코드는 현재 작업중인 코드이므로이 시점에서 소비 코드를 다시 처리 할 수는 없으며이 메서드 만 변경할 수 있습니다.

그래서 지금은 예를 들어, 트랜잭션 범위가 호출 방법들로 사라지면, 나는이 완료 트랩 여전히 수있을 때 있도록 TransactionScope.OnTransactionCompleted 이벤트를보고하고 적절한 메소드를 호출하고 있습니다 :

public void Delete(anObject instance) 
{ 
    try 
    { 
     using (var scope = new TransactionScope(TransactionMode.Inherits, OnDispose.Rollback)) 
     { 
      scope.OnTransactionCompleted += (sender, args) => 
             { 
              //if FAIL 
              MethodCallBecauseOfFailure(); 
              //else SUCCEED 
              MethodCallBecauseOfSuccess(); 
             }; 

      ...(DB Operations) 

      scope.VoteCommit(); 
     } 
    } 
    catch (NHibernate.TransactionException ex) 
    { 
     ...  
    } 
} 

불행히도, 나는 TransactionScope가 실패했는지 성공했는지 여부를 판단 할 수 없습니다. 익명 메소드에 대한 params는 sender = Parent (나는 생각한다!) 트랜잭션 범위와 args = empty이다. 물론 현재 TransactionScope 범위에 액세스 할 수 있습니다. 검사 할 수있는 속성은 거의 없습니다.

실패했거나 성공했는지 여부를 판단 할 수있는 방법이 있습니까?

답변

0

HasSessionError가 도움이 되나요?

try 
{ 
    using (TransactionScope scope = new TransactionScope(TransactionMode.Inherits, OnDispose.Rollback)) 
    { 
     scope.OnTransactionCompleted += (sender, args) => 
            { 
             TransactionScope sender2 = (TransactionScope)sender; 
             if(sender2.HasSessionError) 
              MethodCallBecauseOfFailure(); 
             else 
              MethodCallBecauseOfSuccess(); 
            }; 

     ...(DB Operations) 

     scope.VoteCommit(); 
    } 
} 
catch (NHibernate.TransactionException ex) 
{ 
    ...  
} 

인사말

Juy Juka

+0

아니, 불행히도; 항상 '거짓'인 것처럼 보입니다. SessionScope에서 모든 것을 래핑하려고했지만 여전히 false로 유지됩니다. – OffHeGoes

관련 문제