asp.net - 事务的 SQL 错误超时

标签 asp.net sql-server transactions timeoutexception

我有一个 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 事务会产生这样的问题?为什么没有事务就可以工作?

最佳答案

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

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

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

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

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

关于asp.net - 事务的 SQL 错误超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24360513/

相关文章:

asp.net - SQL Server报表服务和其他报表工具有什么区别

asp.net - @Html.BeginForm 之前的@using block

需要2个不同的sql语句

c# - 来自列表的 SqlBulkCopy<>

python - 为什么在 sqlalchemy 中同时更新同一条记录不会失败?

sql - 交易重复错误

c# - Nuget包...项目中不存在...包...已存在于文件夹中

asp.net - SharePoint Web 部件自定义属性在页面重新加载后才会生效

sql - 如何在 SQL 中获取上次运行的作业详细信息

azure - Windows Azure 存储表中的事务和延续 token