我正在使用以下代码使用Castle ActiveRecord v1.0.3执行删除操作(eugh,legacy!)。
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的范围。很少有物业可以检查。
有没有办法确定它是否失败或成功?
答案 0 :(得分: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