【发布时间】: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