【问题标题】:TransactionScope revert stored procedure changesTransactionScope 还原存储过程更改
【发布时间】:2019-12-30 06:52:34
【问题描述】:

我将TransactionScope 与存储过程一起使用,该存储过程本身不使用事务,但在完成事务范围后,存储过程中所做的更改将被还原。我不明白这是什么问题。

这是我的代码:

using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, TransactionOptionConstant.option1)) 
{
    // Call stored procedure
    transactionScope.Complete();
}

【问题讨论】:

  • 如果 SP 有任何错误,您是否从 SP 发出回滚
  • SP 怎么称呼?
  • 我遇到了还原更改的问题,有一个并行调用的代码可以还原更改
  • 你使用哪一种ORM??
  • 我们正在使用 Dapper

标签: c# sql-server asp.net-web-api stored-procedures transactionscope


【解决方案1】:

如果不查看实际代码(存储过程、调用它的代码以及其余的周围代码)就很难进行调试。来自我的一些提示。

用 try catch 包围你的代码:

try 
{
    using (var transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew, TransactionOptionConstant.option1)) 
    {
        //Call Stored Procedure 
        transactionScope.Complete();
    }
} 
catch (Exception ex) 
{
   // Make sure you never reach this when you call complete.
}

Check the following from Microsoft docs

如果 TransactionScope 对象创建了事务,则资源管理器之间的实际提交工作发生在 End Using 语句中。

如果退出使用没有发生,则不会发生提交。

检查您的存储过程

也许您的存储过程实际上并未保存更改。这也是由注释添加的,但它很可能是在 SQL Server 端捕获的一些异常,在那里处理并且没有传播回代码。

【讨论】:

    【解决方案2】:

    有时您需要创建一个新连接并使用该连接执行您的操作才能执行事务。我假设您有一个 baseRepository 可以为您提供CreateConnection

    我觉得下面的代码可以帮到你

    using (TransactionScope transactionScope = new TransactionScope(scopeOption: TransactionScopeOption.RequiresNew, asyncFlowOption: TransactionScopeAsyncFlowOption.Enabled))
        {
            var dbConn = _baseRepository.CreateConnection(); 
            //use dbConn to Call Stored Procedure
            transactionScope.Complete();
        }
    

    【讨论】:

      【解决方案3】:

      您使用选项TransactionScopeOption.RequiresNew 创建范围。因此,您的 SP 可以在不同的事务中执行。

      尝试设置选项TransactionScopeOption.Required

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 1970-01-01
        • 2017-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多