在DAL中执行多个sql语句时调用TransactionScope.Complete

时间:2015-08-11 20:21:10

标签: c# sql asp.net sql-server

我正在读这篇文章,似乎我不应该调用scope.Complete以便以下代码工作。

当我尝试在不使用scope.Complete()的情况下运行它时,记录将保存到数据库中。如果scope.Complete()存在,则记录保存并且一切正常。

public static void SaveProducts(IList<Product> products)
{
    using (TransactionScope scope = new TransactionScope())
    {
        using (var connection = GetOpenConnection())
        {
            StringBuilder sqlDelete = new StringBuilder();
            sqlDelete.AppendLine("MY SQL STATEMENT HERE ");

            StringBuilder sqlInsert = new StringBuilder();
            sqlInsert.AppendLine("MY SQL STATEMENT HERE ");


            connection.Execute(sqlDelete.ToString(), new { CategoryId = categoryId });
            connection.Execute(sqlInsert.ToString(), products);

        }

        scope.Complete();
    }
}

2 个答案:

答案 0 :(得分:1)

根据doc

  

未能调用此方法会中止事务,因为事务管理器会将此解释为系统故障或在事务范围内引发的异常。

我认为它说如果出现问题,将在完成信号之前处理。

答案 1 :(得分:0)

我将在此处添加,希望有更多人阅读

即使代码中没有任何内容可以更改数据库,也必须调用scope.Complete()。如果您只是读取数据库,如果您甚至没有触摸数据库,请调用scope.Complete()

毫无疑问应该调用scope.Complete(),还是应该调用scope.Complete()。必须在退出TransactionScope using语句之前调用它,或者在调用Dispose()之前手动创建范围。

如果您没有这种习惯,并开始考虑代码中发生的事情,如果您应该或不应该调用scope.Complete(),您的代码将以随机方式开始运行,无法提交,有时会提交,如果存在嵌套事务,您将看到它们失败,如果有多个链式事务,您将看到它们也失败。

确保无论如何调用scope.Complete。