gpt4 book ai didi

c# - SSIS C# 异步 SQL 查询挂起(包括执行存储过程)

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:17 24 4
gpt4 key购买 nike

所以一段时间以来,我一直在尝试解决我的这个特殊问题,在这里查找类似的问题,但遗憾的是一直找不到完全相同的问题。

我想先说明一下,这是我第一次深入尝试使用 C# 进行异步编程。

我目前正在尝试在 SQL Server 数据库中异步执行一组存储过程并记录开始和结束时间。我正在使用 SSIS 中的 C# 脚本任务执行此操作。我已经使用简单地用数字填充虚拟表的测试程序测试了这个过程,并且效果很好。然而,当涉及到执行实际的存储过程(其中一些是密集的)时,一些更快的过程运行但在一些(通常大约相同的 6-7)之后它挂起。共有13个任务(过程)。

此外,我已将脚本任务(以及包中的所有其他组件)的 IsolationLevel 设置为 ReadUncommitted。我已尝试将其设置为快照,但我的 BIDS 版本似乎不支持此方法(或缺少某些安装组件)。

这是我的代码片段(为简洁起见,删除了一些声明):

            // Declarations
Queue<string> procedureQueue = CreateProcedureQueue(procedureTable);
int counter = procedureQueue.Count;

Task<int>[] Tasks = new Task<int>[counter];

using (OleDbConnection activeConnection = new OleDbConnection(connectionString))
{

activeConnection.Open();

// Async Task iteration
for (int i = 0; i < counter; i++)
{
Tasks[i] = Task.Run(async () => await ProcedureTask(procedureQueue.Dequeue(), activeConnection));
}

// Wait for Task completion
try
{
Task.WaitAll(Tasks);
}
catch (Exception e)
{
throw e;
}

}

Dts.TaskResult = (int)ScriptResults.Success;
}
else
{
// Return component result
Dts.TaskResult = (int)ScriptResults.Failure;
}

}

private async Task<int> ProcedureTask(string procedureName, OleDbConnection activeConnection)
{

// Declarations //
string loggingTableName = (string)Dts.Variables["$Project::MonthlyFactSPs_TableName"].Value;

string CommandText =
"update " + loggingTableName + " set last_execution_time = getdate() " +
"where stored_procedure_schema + '.' + stored_procedure_name = '" + procedureName.Replace("[", "").Replace("]", "") + "';" +
"EXEC " + procedureName + " WITH RECOMPILE;" +
"update " + loggingTableName + " set last_completion_time = getdate() " +
"where stored_procedure_schema + '.' + stored_procedure_name = '" + procedureName.Replace("[", "").Replace("]", "") + "';";

// Create new command //
using (OleDbCommand command = new OleDbCommand(CommandText, activeConnection))
{
// Set command parameters //
command.CommandTimeout = 1200;
command.CommandType = CommandType.Text;

try
{
return await command.ExecuteNonQueryAsync();
}
catch (OleDbException e)
{
Dts.Events.FireError(e.ErrorCode, "[" + DateTime.Now + "]" + procedureName + " execution", "Query failed to execute due to: " + e.Message, "", 0);
throw e;
}
}
}

有什么想法吗?是否有一些我没有正确掌握的基本知识?

提前致谢。

最佳答案

发现问题 - 它是由目标表的锁升级设置为 AUTO 引起的,它正在将行独占锁升级为表独占锁。

感谢大家的帮助。

关于c# - SSIS C# 异步 SQL 查询挂起(包括执行存储过程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49688639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com