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 범위에 액세스 할 수 있습니다. 검사 할 수있는 속성은 거의 없습니다.
실패했거나 성공했는지 여부를 판단 할 수있는 방법이 있습니까?
아니, 불행히도; 항상 '거짓'인 것처럼 보입니다. SessionScope에서 모든 것을 래핑하려고했지만 여전히 false로 유지됩니다. – OffHeGoes