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

C# SQL Server 2012-大容量插入错误-此操作与此事务上的另一个挂起操作冲突,c#,sql-server,ado.net,sqlbulkcopy,C#,Sql Server,Ado.net,Sqlbulkcopy,我们正在使用C#组件执行批量插入操作 代码如下: using (SqlCommand sqlCommand = new SqlCommand("SET XACT_ABORT ON", _sqlConnection)) { sqlCommand.SafeExecuteNonQuery(); } var sqlBulkCopy = new SqlBulkCopy(_sqlConnection, bulkCopyOptions, null); sqlBulkCopy.WriteToServ

我们正在使用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\u ABORT ON
语句的代码时,它突然工作并继续工作

当我恢复数据库并重试时,再次出现错误

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


有人知道是什么导致了问题吗?

批量复制选项中的“SqlBulkCopyOptions.CheckConstraints”是否解决了问题?在我的例子中,我进行大容量复制的表有一个外键,该外键指向我在同一事务中插入记录的表。如果是这样,您可能希望大容量复制表不检查外键中是否存在指向另一个表的记录。

您对它是否继续工作有多大把握?在关闭XACT_ABORT时,您可能没有注意到错误。附加探查器,启用错误事件并确保100%没有错误。@usr我确定,因为该操作是从gui触发的。当它工作时,数据会按预期返回,否则不会返回任何内容。那么,如果部分插入数据并抑制错误,该怎么办?SqlBulkCopy支持批处理。在任何情况下,您都需要发布相关代码。我已经添加了发生异常的代码和堆栈跟踪。感谢您的响应。这有助于应用解决方法。暂时禁用外键约束可以解决此问题。仍然很奇怪,因为最后没有在列中插入任何内容,并且允许null。我在相同的设置中遇到了同样的问题:批量插入到具有FK的可空列的表中。由于我没有从错误消息中获得任何信息,我发现默认情况下CheckConstraints为false。设置为true解决了问题。无需删除并重新创建约束,尤其是当多个线程/进程批量插入到同一个表中时。还有其他人。