c# - TransactionScope 错误保存大量信息

标签 c# .net sql-server transactionscope

我正在开发一个使用 C# 和 SQL Server 作为数据库的 .NET Web 应用程序,对于这两种技术都是新手。当我尝试同时保存大量信息时遇到问题。

我的代码很简单:

  SqlConnection cn = null;
  try
  {
    using (TransactionScope scope = new TransactionScope())
    {
      using (cn = Util.getConnection())
      {
        cn.Open();

        BusinessObject.saveObject1(param1, cn);
        BusinessObject.saveObject2(param2, cn);
        BusinessObject.saveObject3(param3, cn);
        BusinessObject.saveObject4(param4, cn);

        ...

        scope.Complete();

      }
    }

我总是使用相同的连接对象,因为如果发生错误,我必须撤销数据中的任何更改,并且如果过程正常,则需要相同的行为。

我不介意保存过程需要花费很多时间,在我的应用程序中这是完全正常的,因为我必须保存大量信息。

这里的奇怪之处是:

  • 当我在数据库的同一局域网中执行此函数时,它完美运行。
  • 但是,如果我从外部执行它,例如通过 VPN 连接,因此延迟较高,我会收到一条错误消息:“与当前连接关联的事务已完成,但尚未完成”已处置。必须先处置事务,然后才能使用连接执行 SQL 语句。”

我尝试通过 web.config 中的连接字符串更改数据库的超时,但没有解决任何问题。另外,如果在每个 executeNonQuery() 语句之后执行 cn.Dispose(),则在下次尝试使用连接对象时会收到错误。

我必须更改 TransactionScope 对象的参数吗?还有其他更好的方法吗?

提前致谢。

最佳答案

这是由于超时错误造成的。 TransactionScope 可能会决定在超时时回滚事务。

您需要增加 TransactionScope 构造函数中的超时值。默认最大值超时时间为 10 分钟。

关于c# - TransactionScope 错误保存大量信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11491266/

相关文章:

c# - 使用 Visual Studio 自动格式化内联空格

c# - 如何将 Azure Function HttpRequest 正文转换为对象

c# - 从字符串中删除隐藏字符

sql - 根据跨系统数据库中的唯一对象名称创建数字键?

sql-server - 配置文件更改后重启或不重启

c# - 使用方法更新列表?

c# - 纯在 XAML 中定义绑定(bind)时,源变量是否可以在后面的代码中访问?

.net - 我可以使用某些查看器来查看和搜索serilog日志文件吗?

mysql - 我可以从 DTS 迁移到等效的 MySQL 工具吗?

c# - 在 C# 中包私有(private)?