如何在TransactionScope提交后才运行自定义c#函数

本文关键字:运行 自定义 函数 TransactionScope 提交 | 更新日期: 2023-09-27 18:01:29

我有一个TransactionScope,我所有的SQL Server连接都参与其中。如果其中任何一个调用失败,则一切都如预期的那样正确回滚。

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

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

然而,这看起来相当粗糙。

是否有一种方法内置到TransactionScope对象运行一个函数后,只有提交已经发生?

之类的东西
Transaction.Scope.Current.Enlist(
    onCommit: () => MyCustomSuccessFunction(),
    onRollback: () => MyCustomFailureFunction());

如何在TransactionScope提交后才运行自定义c#函数

找到一个合适的答案: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);