【问题标题】:Simple update command causes SqlException Execution Timeout Expired简单更新命令导致SqlException Execution Timeout Expired
【发布时间】:2018-03-08 19:04:28
【问题描述】:

我有一个将 mssql-db(源)转换为另一个 mssql-db(目标)的应用程序。对于我源中的每个表,我基本上都会获取所有行并为我的目标中的每一行插入一个。我运行一个简单的查询来更新源行以存储插入到目标数据库的记录的目标表和目标 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 字段是主键。

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


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


这是命令的执行方式:

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();
        }
    }
}

【问题讨论】:

  • 不相关:不要使用字符串连接来构建查询。使用 SQL 参数。
  • 我愿意,这只是为了简化我的问题。
  • 听起来你遇到了锁定情况——当你监控 SQL 运行时会发生什么
  • 好的。我只是保留参数并通过将参数设置部分替换为例如“//为简洁起见省略参数设置”或其他内容来缩写示例。否则,您将始终触发“使用参数”反射;)
  • 你试过设置命令超时msdn.microsoft.com/en-us/library/…吗?

标签: c# sql-server sqlexception


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    问题是,在源上进行更新的进程被在源上进行选择的进程阻止了。我必须将这些包装到一个事务中才能使用IsolationLevel.ReadUncommitted。现在可以了。

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 2020-02-09
      • 2013-05-30
      • 2011-02-15
      • 2010-09-13
      • 2019-01-27
      • 1970-01-01
      • 2018-02-23
      相关资源
      最近更新 更多