我正在读这篇文章,似乎我不应该调用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();
}
}
答案 0 :(得分:1)
答案 1 :(得分:0)
我将在此处添加,希望有更多人阅读
即使代码中没有任何内容可以更改数据库,也必须调用scope.Complete()。如果您只是读取数据库,如果您甚至没有触摸数据库,请调用scope.Complete()毫无疑问应该调用scope.Complete(),还是应该调用scope.Complete()。必须在退出TransactionScope using语句之前调用它,或者在调用Dispose()之前手动创建范围。
如果您没有这种习惯,并开始考虑代码中发生的事情,如果您应该或不应该调用scope.Complete(),您的代码将以随机方式开始运行,无法提交,有时会提交,如果存在嵌套事务,您将看到它们失败,如果有多个链式事务,您将看到它们也失败。
确保无论如何调用scope.Complete。