场景:
我有一个使用SQL Server 2008的asp.net Web服务。它应该执行一些长时间运行的数据库更新,它涉及在1个请求中批量插入记录到3个表。大约有220个此类请求。
请求执行的流程是
read file having data
bulk copy into table1
call sp to process data in table1
bulk copy into table2
call sp to process data in table2
bulk copy into table3
call sp to process data in table3
在这220个请求中,几乎有1/3的请求在尝试使用两种异常的表1或表2中批量加载数据时失败
table3批量加载如果执行则永远不会失败
这发生在测试服务器上。当我从测试服务器获得相同的文件时,我看到错误并在我的机器上调试它,一切正常。
随机列映射错误也没有意义,因为文件中的数据结构始终保持不变,从开发机器执行时不会产生错误。
另一个观察结果是它使SQL Server内存消耗非常高,以至于它最终开始抛出OutOfMemory异常
我不知道从哪里开始缩小问题范围。请指教。
编辑:我尝试为批量上传设置batchsize,并指定选项 - useInternalTransaction,之后我随机获得Unexpected Existing Transaction。但是,如果我尝试从我的机器上批量加载相同的xml,那么它使用相同的代码+相同的数据库工作正常
编辑:2013-12-06 我尝试过的一件事情就是将外部事务传递给SqlBulkCopy构造函数。但我仍然不明白为什么没有交易会失败。
编辑:2013-12-24 ArgumentOutOfRange异常的堆栈跟踪
[ L'index était hors limites. Il ne doit pas être négatif et doit être inférieur à la taille de la collection.
Nom du paramètre : index at à System.Collections.ArrayList.get_Item(Int32 index)
à System.Data.SqlClient.BulkCopySimpleResultSet.get_Item(Int32 idx)
à System.Data.SqlClient.SqlBulkCopy.AnalyzeTargetAndCreateUpdateBulkCommand(BulkCopySimpleRes ultSet internalResults)
à System.Data.SqlClient.SqlBulkCopy.WriteToServerInternal()
à System.Data.SqlClient.SqlBulkCopy.WriteRowSourceToServer(Int32 columnCount)
à System.Data.SqlClient.SqlBulkCopy.WriteToServer(IDataReader reader)
转换为
Index was out of range. It must not be negative and must be less than the size of the collection.
此外,拥有交易不会改变它。我认为它确实如此,但是当我的应用程序开始更新文件时,我确实看到了错误。