简单更新命令导致SqlException Execution Timeout Expired

时间:2018-03-08 09:34:36

标签: c# sql-server sqlexception

我有一个将mssql-db(源)转换为另一个mssql-db(target)的应用程序。对于源代码中的每个表,我基本上都会得到所有行,并为每一行插入目标。我运行一个简单的查询,它更新source-row以存储插入到target-db的记录的target-table和target-id:

var commandText = $"UPDATE SOURCE_TABLE SET SOURCE_TABLE.TARGET_ID = '{target_id}', SOURCE_TABLE.TARGET_TBL = '{target_table}' WHERE SOURCE_TABLE.ID = '{id}'";

base.Source.ExecuteNonQuery(commandText);

这样运行完全正常,直到我尝试更新特定表的源行。我得到一个SqlException Execution Timeout Expired

我检查了变量target_id,target_table和id,它们都填充了有效值。我已禁用所有触发器,而id-field是主键。

当我通过management-studio运行此命令时,没有问题。甚至不需要一秒钟来处理。

我使用了来自management-studio的activity-monitor来监视sql运行的时间。带有红色框的数据库是target-db。 activity-monitor 第二个图中的每个峰值(“Wartende Tasks”=“等待任务”)。表示已尝试执行查询一次。

这是命令的执行方式:

public int ExecuteNonQuery(string commandText)
{
    using (var connection = this.CreateConnection()) // new SqlConnection(CONNECTION_STRING)
    {
        connection.Open();
        using (var command = connection.CreateCommand())
        {
            command.CommandText = commandText;

            return command.ExecuteNonQuery();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可以尝试在查询之前添加begin事务,然后在查询之后添加提交事务吗?我会尝试在源上插入和目标更新。

答案 1 :(得分:0)

问题是,对源进行更新的进程阻止了对源进行更新的进程。我必须将这些包装到事务中以使用IsolationLevel.ReadUncommitted。现在它有效。