【问题标题】:SQL error timeout with transaction事务的 SQL 错误超时
【发布时间】:2014-06-23 07:27:03
【问题描述】:

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

  • 将原始 CSV 数据导入对应的 SQL 表(具有相同的列)
  • 使用一些 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 事务会产生这样的问题?为什么它在没有事务的情况下工作?

【问题讨论】:

  • 在漫长的等待期间暂停调试器。在此处发布完整的堆栈跟踪,包括外部代码。之后,看看你的语句是否被阻塞(可能使用 sp_who2)。
  • @usr: 使用调试器,一步一步进行,永远不会触发错误,并且单步执行单个 SQL 子句(几乎)是立即的。此外,该问题仅通过虚拟机触发,我不知道如何“远程”使用调试器...

标签: asp.net sql-server transactions timeoutexception


【解决方案1】:

经过几次测试,我发现问题是......内存不足!

我发现我的情况和这个答案完全一样:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多