简单更新命令导致SqlException Execution Timeout Expired
Simple update command causes SqlException Execution Timeout Expired
我有一个将 mssql-db(源)转换为另一个 mssql-db(目标)的应用程序。对于源代码中的每个 table,我基本上都获取了所有行,并将每一行插入到我的目标中。我 运行 一个简单的查询,它更新源行以存储目标-table 和插入目标数据库的记录的目标 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);
在我尝试更新特定 table 的源行之前,这 运行 非常好。我得到一个 SqlException Execution Timeout Expired
。
我检查了变量 target_id、target_table 和 id 它们都填充了有效值。我已禁用所有触发器并且 id 字段是主键。
当我通过management-studio 运行这个命令时,没有问题。甚至不需要一秒钟的时间来处理。
我使用管理工作室的 activity-monitor 来监视 sql 运行 的时间。带有红色框的数据库是目标数据库。
第二个图表中的每个峰值 ("Wartende Tasks" = "waiting 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();
}
}
}
您能否尝试在查询之前添加一个开始事务,然后在查询之后添加一个提交事务?我会尝试在源上插入和在目标上更新。
问题是,在源上进行更新的进程被在源上进行 select 的进程阻塞。我必须将它们包装到交易中才能使用 IsolationLevel.ReadUncommitted
。现在可以了。
我有一个将 mssql-db(源)转换为另一个 mssql-db(目标)的应用程序。对于源代码中的每个 table,我基本上都获取了所有行,并将每一行插入到我的目标中。我 运行 一个简单的查询,它更新源行以存储目标-table 和插入目标数据库的记录的目标 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);
在我尝试更新特定 table 的源行之前,这 运行 非常好。我得到一个 SqlException Execution Timeout Expired
。
我检查了变量 target_id、target_table 和 id 它们都填充了有效值。我已禁用所有触发器并且 id 字段是主键。
当我通过management-studio 运行这个命令时,没有问题。甚至不需要一秒钟的时间来处理。
我使用管理工作室的 activity-monitor 来监视 sql 运行 的时间。带有红色框的数据库是目标数据库。
命令是这样执行的:
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();
}
}
}
您能否尝试在查询之前添加一个开始事务,然后在查询之后添加一个提交事务?我会尝试在源上插入和在目标上更新。
问题是,在源上进行更新的进程被在源上进行 select 的进程阻塞。我必须将它们包装到交易中才能使用 IsolationLevel.ReadUncommitted
。现在可以了。