SQLBulkCopy導致死鎖

c# deadlock sqlbulkcopy sql-server

我有以下代碼..它實際上使用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選項,則進程將嘗試獲取獨占表鎖。如果您的進程首先獲取共享表鎖,其他進程具有共享行鎖,並且兩個進程都嘗試將其鎖升級為獨占鎖,則肯定會導致死鎖。

有幾種方法可以獲得有關死鎖的更多信息:



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因