SqlBulkCopy causa Deadlock su SQL Server 2000

.net asp.net sql sqlbulkcopy sql-server

Domanda

Ho un file eseguibile di importazione dati personalizzato in. NET 3.5 che lo SqlBulkCopy fondamentalmente fa inserimenti più veloci su grandi quantità di dati. L'app in pratica prende un file di input, massaggia i dati e li carica in massa in un SQL Server 2000. È stato scritto da un consulente che lo stava costruendo con un ambiente di database SQL 2008. Questa differenza potrebbe essere la causa? SQL 2000 ha l'utilità bcp su cui è basato BulkCopy. Quindi, quando abbiamo eseguito questo, ha attivato un errore deadlock.

Dettagli di errore: Transaction (Process ID 58) era deadlock su risorse di blocco con un altro processo ed è stato scelto come vittima del deadlock. Rieseguire la transazione.

Ho provato numerosi modi per provare a risolverlo. come impostare temporaneamente la variabile stringa di connessione MultipleActiveResultSets = true, che non era l'ideale, ma dà comunque un errore Deadlock. Mi sono anche assicurato che non si trattasse di un problema di timeout della connessione.

ecco la funzione Qualche consiglio?

/// <summary>
    /// Bulks the insert.
    /// </summary>
    public void BulkInsert(string destinationTableName, DataTable dataTable)
    {
        SqlBulkCopy bulkCopy;

        if (this.Transaction != null)
        {
            bulkCopy = new SqlBulkCopy
                (
                    this.Connection,
                    SqlBulkCopyOptions.TableLock,
                    this.Transaction
                );
        }
        else
        {
            bulkCopy = new SqlBulkCopy
                (
                    this.Connection.ConnectionString,
                    SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.UseInternalTransaction
                );
        }

        bulkCopy.ColumnMappings.Add("FeeScheduleID", "FeeScheduleID");
        bulkCopy.ColumnMappings.Add("ProcedureID", "ProcedureID");
        bulkCopy.ColumnMappings.Add("AltCode", "AltCode");
        bulkCopy.ColumnMappings.Add("AltDescription", "AltDescription");
        bulkCopy.ColumnMappings.Add("Fee", "Fee");
        bulkCopy.ColumnMappings.Add("Discount", "Discount");
        bulkCopy.ColumnMappings.Add("Comment", "Comment");
        bulkCopy.ColumnMappings.Add("Description", "Description");


        bulkCopy.BatchSize = dataTable.Rows.Count;
        bulkCopy.DestinationTableName = destinationTableName;
        bulkCopy.WriteToServer(dataTable);

        bulkCopy = null;
    }

Risposta popolare

Sono finalmente riuscito a ottenere una copia locale del nostro database di produzione (circa 50 concerti) per testare l'applicazione. Risulta che il dealocking era strettamente un problema ambientale. Grazie ragazzi.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow