SQL Server 2012 - 大容量插入错误 - 此操作与此事务上的另一个挂起操作冲突

本文关键字:操作 另一个 挂起 冲突 事务 插入 大容量 错误 SQL Server 2012 | 更新日期: 2023-09-27 17:56:52

我们正在使用 C# 组件执行批量插入操作。

这是代码:

using (SqlCommand sqlCommand = new SqlCommand("SET XACT_ABORT ON", _sqlConnection))
{
    sqlCommand.SafeExecuteNonQuery();
}
var sqlBulkCopy = new SqlBulkCopy(_sqlConnection, bulkCopyOptions, null);
sqlBulkCopy.WriteToServer(table);

发生以下错误:

此操作与此事务上的另一个挂起操作冲突。操作失败。

堆栈跟踪:

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlBulkCopy.RunParser(BulkCopySimpleResultSet bulkCopyHandler)
at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinuedOnSuccess(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsyncContinued(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
at System.Data.SqlClient.SqlBulkCopy.CopyBatchesAsync(BulkCopySimpleResultSet internalResults, String updateBulkCommandText, CancellationToken cts, TaskCompletionSource`1 source)
at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestContinuedAsync(BulkCopySimpleResultSet internalResults, CancellationToken cts, TaskCompletionSource`1 source)
at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalRestAsync(CancellationToken cts, TaskCompletionSource`1 source)
at System.Data.SqlClient.SqlBulkCopy.WriteToServerInternalAsync(CancellationToken ctoken)
at System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServerAsync(Int32 columnCount, CancellationToken ctoken)
at System.Data.SqlClient.SqlBulkCopy.WriteToServer(DataTable table, DataRowState rowState)

当我调试代码并跳过执行 SET XACT_ABORT ON 语句的代码时,它会突然工作并继续工作。

当我还原数据库并重试时,我再次收到错误。

大容量插入只是在表中插入一条记录。

有谁知道可能导致问题的原因?

SQL Server 2012 - 大容量插入错误 - 此操作与此事务上的另一个挂起操作冲突

批量复制选项中的"SqlBulkCopyOptions.CheckConstraint"能解决问题吗? 在我的例子中,我正在执行批量复制的表具有我在同一事务中插入记录的表的外键。 如果是这种情况,您可能希望大容量复制表不检查外键中转到另一个表的现有记录。