我有一个 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);
关于c# - 如何仅在 TransactionScope 提交时运行自定义 C# 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38860525/