TransactionScope错误保存了大量信息

时间:2012-07-15 10:50:59

标签: 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对象的参数?还有另一种更好的方法吗?

先谢谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

scope.Complete();移到connection区块(MSDN article)之外。

答案 2 :(得分:1)

您是否尝试在Timeout = 0功能中设置Util.getConnection()?值0表示没有限制。这肯定会完成这项工作。通过设置Timeout = 0将完成每个长期操作作业。