如果您对我的测试应用程序感兴趣,在这里:SqlBulkCopy-Error-and-Transaction-Test.zip
我的问题是:
SqlBulkCopyOptions.UseInternalTransaction
是否已过时,因为SqlBulkCopy
始终使用内部事务?- 如果不是:这个选项的实际含义是什么?在哪些情况下会有所不同?
希望有人能澄清一下。
编辑:根据答案和评论,我认为我的问题不够清晰。我知道文档中写到:“默认情况下,批量复制操作是自己的事务。”并且每个批次在传递UseInternalTransaction
时都使用自己的事务。但如果这意味着默认情况下批量复制操作仅使用一个事务来处理整个批量(而不是每个批次一个事务),那么如果我将BatchSize设置为一定大小,并且后面的批次出现错误,我就无法将记录保存到数据库中。如果只使用一个事务,所有添加到事务日志中的记录都将被回滚。但我得到了位于包含错误记录的批次之前的批次的记录。根据这个,似乎默认情况下每个批次都在自己的事务中执行。这意味着无论我是否传递UseInternalTransaction
,都没有区别。如果我在这里走错了路,我真的很希望有人能澄清一下。
有一个事实可能很重要:我使用的是SQL Server 2012。也许SQL Server 2008的行为不同,我会检查一下。
编辑:感谢usr的回复,我想我找到了答案:我进行了调试和分析,发现如果没有定义UseInternalTransaction,则私有字段_internalTransaction确实未设置。然后SqlBulkCopy不使用自己的(内部)事务。但是分析表明,SqlBulkCopy使用TDS(表格数据流)来复制数据(无论BatchSize是什么)。我没有找到关于SQL Server特别是TDS的太多信息,但我假设SQL Server在内部事务中执行TDS批量复制操作。因此,对于SQL Server来说,UseInternalTransaction似乎有点冗余,但为了安全起见,我会将其设置。