SQLBulkCopy verursacht Deadlock

c# deadlock sqlbulkcopy sql-server

Frage

Ich habe den folgenden Code .. which tatsächlich Daten in Ziel mit SQLBulkCopy eingefügt. Dieser Code schlägt häufig aufgrund von Deadlock im Quell-SQL-Server fehl. Zu Ihrer Information: Die Tabelle, die kopiert wird, kann verwendet werden (ich meinte, einige Einfügungen / Auswahlvorgänge würden ausgeführt werden), während wir eine Massenkopie durchführen.

Hat das Problem oder der "TABLOCK" -Hinweis etwas zu tun? Nach meinem Verständnis Erwerb von TABLOCK nur gemeinsame Sperren und sollte kein Problem sein.

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

Beliebte Antwort

Die Masseneinfügung muss Zeilen in die Tabelle einfügen. Das Einfügen von Zeilen erfordert exklusive Sperren. Die genauen erhaltenen Sperren hängen vom Gleichzeitigkeitsmodell ab.

Wenn Sie die Option " TableLock angeben, TableLock Ihr Prozess, eine exklusive Tabellensperre zu erhalten. Dies kann definitiv zu Deadlocks führen, wenn Ihr Prozess zuerst eine gemeinsame Tabellensperre erwirbt, ein anderer Prozess gemeinsame Zeilensperren hat und beide Prozesse versuchen, ihre Sperren auf exklusive Sperren zu aktualisieren.

Es gibt mehrere Möglichkeiten, mehr Informationen über die Deadlocks zu erhalten:



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum