SqlBulkCopy provoca un interbloqueo en SQL Server 2000

.net asp.net sql sqlbulkcopy sql-server

Pregunta

Tengo un archivo ejecutable de importación de datos personalizado en .NET 3.5, en el cual SqlBulkCopy básicamente realiza inserciones más rápidas en grandes cantidades de datos. Básicamente, la aplicación toma un archivo de entrada, masajea los datos y los carga de forma masiva en un SQL Server 2000. Fue escrito por un consultor que la estaba construyendo con un entorno de base de datos SQL 2008. ¿Estaría causando esto la diferencia env? SQL 2000 tiene la utilidad bcp que es en lo que se basa BulkCopy. Entonces, cuando ejecutamos esto, se desencadenó un error de interbloqueo.

Detalles del error: La transacción (Id. Del proceso 58) se bloqueó en los recursos de bloqueo con otro proceso y se eligió como la víctima del interbloqueo. Vuelva a ejecutar la transacción.

He intentado numerosas maneras de tratar de resolverlo. como configurar temporalmente la variable de cadena de conexión MultipleActiveResultSets = true, lo cual no fue ideal, pero aún así da un error de interbloqueo. También me aseguré de que no fuera un problema de conexión.

Aquí está la función. ¿Algún consejo?

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

Respuesta popular

Finalmente pude obtener una copia local de nuestra base de datos de producción (~ 50 gigas) para probar la aplicación. Resulta que el acuerdo fue estrictamente un problema de medio ambiente. Gracias amigos.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué