如何在TransactionScope提交后才运行自定义c#函数
本文关键字:运行 自定义 函数 TransactionScope 提交 | 更新日期: 2023-09-27 18:01:29
我有一个TransactionScope,我所有的SQL Server连接都参与其中。如果其中任何一个调用失败,则一切都如预期的那样正确回滚。
然而,我有多个数据存储,有时需要在同一个调用中更新。第二个数据存储不会自动登记到事务中。
我有一些关于如何阻止其他数据存储获取过早数据的想法。我首先想到的是executioncontext级别的属性,只有当设置为一个值(例如,提交或回滚为true或false)时,更新其他数据存储的事件才会启动。
然而,这看起来相当粗糙。
是否有一种方法内置到TransactionScope对象运行一个函数后,只有提交已经发生?
之类的东西Transaction.Scope.Current.Enlist(
onCommit: () => MyCustomSuccessFunction(),
onRollback: () => MyCustomFailureFunction());
找到一个合适的答案:https://msdn.microsoft.com/en-us/library/ms149779(v=vs.110).aspx
private class FooEnlistment : IEnlistmentNotification
{
private readonly Action _CommitAction;
private readonly Action _RollbackAction;
public EventEnlistment(Action onCommit, Action onRollback)
{
_CommitAction = onCommit;
_RollbackAction = onRollback;
}
public void Prepare(PreparingEnlistment preparingEnlistment)
{
preparingEnlistment.Prepared();
}
public void Commit(Enlistment enlistment)
{
_CommitAction();
enlistment.Done();
}
public void Rollback(Enlistment enlistment)
{
_RollbackAction();
enlistment.Done();
}
public void InDoubt(Enlistment enlistment)
{
enlistment.Done();
}
}
然后,在问题中代替
Transaction.Scope.Current.Enlist(
onCommit: () => MyCustomSuccessFunction(),
onRollback: () => MyCustomFailureFunction());
你可以这样做:
var enlistment = new FooEnlistment(MyCustomSuccessFunction, MyCustomFailureFunction);
Transaction.Current.EnlistVolatile(enlistment, EnlistmentOptions.None);