我正在使用以下代码使用 Castle ActiveRecord v1.0.3 执行删除操作(呃,旧版!)。
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();
}
}
问题是,由于 TransactionMode.Inherits,此方法的使用者可以将对此方法的调用包装在他们自己的 ActiveRecord.TransactionScope 中。在他们这样做的情况下,异常不会发生在 scope.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 是失败还是成功。匿名方法的参数是 sender = Parent(我认为!)事务范围,并且 args = empty。当然,我可以访问当前 TransactionScope 的范围。可供检查的属性很少。
有什么方法可以判断它是失败还是成功?