事务的SQL错误超时

时间:2014-06-23 07:27:03

标签: asp.net sql-server transactions timeoutexception

我有一个ASP.NET应用程序从CSV文件导入数据,并将其存储到(SQL Server)数据库表中。基本上,导入过程包括:

  • 将原始CSV数据导入相应的SQL表(具有相同的列)
  • "合并"数据进入DB,带有一些sql子句(INSERTS和UPDATE)

整个导入程序包含在一个事务中。

using (SqlConnection c = new SqlConnection(cSqlHelper.GetConnectionString()))
{
    c.Open();

    SqlTransaction trans = c.BeginTransaction();

    SqlCommand cmd = new SqlCommand("DELETE FROM T_TempCsvImport", c, trans);
    cmd.ExecuteNonQuery();

    // Other import SQL ...

    trans.Commit();
}

从虚拟机尝试此导入过程(一切都是本地的),我收到错误

[SqlException (0x80131904): Timeout. The timeout period elapsed prior to completion of the operation or the server is not responding.

在没有交易的情况下尝试相同的,工作正常。

我试过的东西:

  • 从SQL Server Management Studio执行相同的查询,所有这些查询都运行得非常快(500毫秒)
  • 从我的开发机器执行,工作正常
  • 增加命令超时,无论如何我得到了错误。我还尝试将CommandTimeout设置为0(无限),并且该过程似乎运行"永远" (我得到服务器超时,我设置为10分钟)

所以,最后一个问题是:为什么SQL事务会产生这样的问题?为什么没有交易就能正常工作?

1 个答案:

答案 0 :(得分:2)

经过几次测试后,我发现问题是......没有足够的记忆!

我发现我的情况与这个答案完全相同:

Help troubleshooting SqlException: Timeout expired on connection, in a non-load situation

我的本​​地计算机上有IIS和SQL服务器,测试在虚拟机上运行。这个虚拟机使用的是2Gb的RAM,占我PC总RAM的50%。将虚拟机可用的RAM减少到512Mb可以解决问题。

此外,我注意到当系统工作时,使用交易或不使用交易具有完全相同的结果,所以我的第一个猜测也是错误的。