如何仅在TransactionScope已提交时运行自定义C#函数?

如何仅在TransactionScope已提交时运行自定义C#函数?,c#,transactions,C#,Transactions,我有一个TransactionScope,我的所有SQL Server连接都在其中登记。如果任何调用失败,所有调用都会按预期正确回滚 但是,我有多个数据存储,有时需要在同一个调用中更新。第二个数据存储不会自动登记到事务中 我有一些关于如何阻止其他数据存储获取过早数据的想法。我的第一个想法是ExecutionContext级别的属性,只有当设置为某个值(例如,对于提交或回滚,为true或false)时,更新其他数据存储的事件才会触发 然而,这似乎有点骇人听闻 TransactionScope对象中

我有一个TransactionScope,我的所有SQL Server连接都在其中登记。如果任何调用失败,所有调用都会按预期正确回滚

但是,我有多个数据存储,有时需要在同一个调用中更新。第二个数据存储不会自动登记到事务中

我有一些关于如何阻止其他数据存储获取过早数据的想法。我的第一个想法是ExecutionContext级别的属性,只有当设置为某个值(例如,对于提交或回滚,为true或false)时,更新其他数据存储的事件才会触发

然而,这似乎有点骇人听闻

TransactionScope对象中是否有一种内置的方法,可以仅在提交后运行函数?类似于

Transaction.Scope.Current.Enlist(
    onCommit: () => MyCustomSuccessFunction(),
    onRollback: () => MyCustomFailureFunction());

在这里找到了一个不错的答案:

然后,在问题中,而不是

    Transaction.Scope.Current.Enlist(
        onCommit: () => MyCustomSuccessFunction(),
        onRollback: () => MyCustomFailureFunction());
你会做:

    var enlistment = new FooEnlistment(MyCustomSuccessFunction, MyCustomFailureFunction);
    Transaction.Current.EnlistVolatile(enlistment, EnlistmentOptions.None);

也许您应该将调用包装在一个帮助函数中,该函数允许您传入提交/回滚函数引用。我不知道ADO.Net中有任何“内置”的东西,尽管如果您使用的是特定的抽象/orm,它可能包含一些东西。目前这个问题过于宽泛,无法正确回答。
    var enlistment = new FooEnlistment(MyCustomSuccessFunction, MyCustomFailureFunction);
    Transaction.Current.EnlistVolatile(enlistment, EnlistmentOptions.None);