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

标签 c# transactions

我有一个 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/

相关文章:

c# - 设置 textBox.Text 不会更新绑定(bind)的双向属性?

C# 类变量问题

C# MetroTile 背景色/前色在鼠标进入/离开期间不改变

php - 如何获取 Codeigniter 中模型之间事务关系的最后一个 id?

python - Django 嵌套 transaction.atomic 抛出 IntegrityError "SAVEPOINT does not exist"与 MySQL

Spring 交易TransactionSynchronizationManager : isActualTransactionActive vs isSynchronizationActive

c# - C#如何附加string.join而不附加最后一个字符串

c# - 如何识别 DataGridView 中悬停的特定单元格

transactions - 计算交易中具有重复项的频繁项集

api - 转换问题时,JIRA REST API 是否需要提交转换 ID?