SqlBulkCopy导致SQL Server 2000上出现死锁

.net asp.net sql sqlbulkcopy sql-server

我在.NET 3.5中有一个自定义数据导入可执行文件,SqlBulkCopy基本上可以更快地插入大量数据。该应用程序基本上采用输入文件,按摩数据并批量上传到SQL Server 2000.它是由一个使用SQL 2008数据库环境构建它的顾问编写的。这种环境差异会导致这种情况吗? SQL 2000确实有bcp实用程序,这是BulkCopy所基于的。因此,当我们运行它时,它会触发死锁错误。

错误详细信息:事务(进程ID 58)在锁资源上与另一个进程死锁,并被选为死锁牺牲品。重新运行该交易。

我已尝试过多种方法来尝试解决它。比如临时设置连接字符串变量MultipleActiveResultSets = true,这不是理想的,但它仍然会给出死锁错误。我还确保它不是连接超时问题。

这是功能。任何建议?

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

热门答案

我终于能够获得我们的生产数据库的本地副本(~50演出)来测试应用程序。事实证明,交易严重是一个环境问题。谢谢费拉斯。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因