gpt4 book ai didi

c# - SQLBulkCopy 导致死锁

转载 作者:行者123 更新时间:2023-11-30 15:20:50 27 4
gpt4 key购买 nike

我有以下代码..它实际上使用 SQLBulkCopy 将数据插入目标。由于死锁,此代码在源 SQL 服务器中经常失败。仅供引用,正在复制的表可以在我们执行批量复制时使用(我的意思是一些插入/选择将运行)。

这是导致问题的原因还是“TABLOCK”提示有什么关系?根据我的理解,TABLOCK 仅获取共享锁,应该不是问题。

using (var reader = srcConnection.ExecuteReader($"select * from [{DatabaseName}].[{schemaName}].[{tableName}]"))
{
const SqlBulkCopyOptions bulkCopyOptions = SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.FireTriggers |
SqlBulkCopyOptions.KeepNulls | //Do not replace nulls with defaults in destination
SqlBulkCopyOptions.KeepIdentity;
//Use the identity values from source, do not generate identities in destination.

using (var bcp = new SqlBulkCopy(dstConnection.ConnectionString, bulkCopyOptions))
{
const int threeMinutes = 60*3;

bcp.BulkCopyTimeout = threeMinutes; //Timeout is for a single batch
bcp.BatchSize = 5000;
bcp.DestinationTableName = $"[{DestinationDatabaseName}].[{schemaName}].[{tableName}]";
bcp.EnableStreaming = true;

foreach (var col in table.Columns.Cast<Column>().Where(c => !c.Computed))
{
bcp.ColumnMappings.Add(col.Name, col.Name);
}

bcp.WriteToServer(reader);
}
}

最佳答案

批量插入需要将行插入到表中。插入行需要独占锁。获取的确切锁将取决于并发模型。

如果您指定TableLock 选项,您的进程将尝试获取独占表锁。如果您的进程首先获取共享表锁,其他进程拥有共享行锁,并且两个进程都尝试将它们的锁升级为独占锁,这肯定会导致死锁。

有几种方法可以获取有关死锁的更多信息:

关于c# - SQLBulkCopy 导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39124318/

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