微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SqlBulkCopy:传递SqlBulkCopyOptions.UseInternalTransaction和不传递之间的区别是什么?

我试图find使用sqlBulkcopy与sqlBulkcopyOptions.UseInternalTransaction复制选项之间的区别,没有它,但在我的testing应用程序,我没有发现任何区别。 如果BatchSize是例如0,我添加100个logging(在一个DataTable ),其中logging号50导致一个错误,当它添加数据库表时,我得到0logging在表中。 如果BatchSize设置为10,例如,我得到了40条logging(4批10条logging,第5批包含错误logging并导致批量复制中止)。 不pipe是否设置了S qlBulkcopyOptions.UseInternalTransaction ,我都会得到相同的结果。 看来批量总是在内部交易中复制。

如果你对我的testing应用程序感兴趣,那么这里是: sqlBulkcopy-Error-and-Transaction-Test.zip

我的问题是:

sqlBulkcopyOptions.UseInternalTransaction是否过时,因为sqlBulkcopy总是使用内部事务?

如果不是:这个选项的实际含义是什么? 在哪些情况下会有所作为?

希望有人能澄清

.NET应用程序在Windows 10上将不同的操作系统版本返回给PowerShell

.NET与.NET Core 2不同的P / Invoke入口点

通过.NET确定现有的本地Windows帐户

获取计算机上安装的所有驱动程序

显示多个可移动驱动器窗口的C#代码8

编辑:根据答案和评论,我认为我的问题还不够清楚。 我知道文档。 它说:“认情况下,大容量复制操作是它自己的事务。” 并且每个批处理在传递UseInternalTransaction时使用它自己的事务。 但是,如果这意味着认情况下,大容量复制操作对整个大容量复制只使用一个事务(而不是每个批量使用一个),如果将BatchSize设置为特定大小,并且批量位于后面,则不会在数据库获取logging第一个导致错误。 如果只使用一个事务,则添加到事务日志的所有logging都将被回滚。 但是,我得到包含错误logging的批次之前的批次logging。 据此,似乎认情况下每个批处理都在自己的事务中执行。 这意味着我是否通过UseInternalTransaction没有区别。 如果我在这里走错了路,我会很感激,如果有人能澄清。

一个事实可能是重要的:我使用sql Server 2012.也许sql Server 2008行为不同。 我会检查的

编辑:感谢来自usr的回复,我想我find了答案:我debugging和分析了一下,发现私人领域_internalTransaction真的没有设置,如果UseInternalTransaction没有定义。 sqlBulkcopy然后不使用自己的(内部)事务。 但分析表明,sqlBulkcopy使用TDS(表格数据stream)来复制数据(不pipeBatchSize是什么)。 我没有find关于TDS的许多信息,尤其是sql Server,但是我认为sql Server在内部事务中执行TDS批量复制操作。 因此UseInternalTransaction似乎对于sql Server来说是多余的,但是为了安全起见,我会设置它。

c#winforms:确定程序的第一次运行

在.Net CLI应用程序中显示完成百分比的最佳方法是什么?

在启动Avaya主动拨号程序时,WPF中的System.AccessViolationException

机器启动时运行exe

Powershell Get-Content + Invoke-Expression单独执行语句,还是一次执行所有语句?

如果你设置了这个选项,那么sqlBulkcopy类将添加一个

_internalTransaction = _connection.BeginTransaction();

围绕每批。

但是这个选项与sql server没有实际的区别,认情况下在auto commit模式下运行。

唯一可以观察到的区别是它执行验证,您还没有尝试传入外部事务。

以下将成功并回滚所有批次

var transaction = sourceConnection.BeginTransaction(); using (sqlBulkcopy bulkcopy = new sqlBulkcopy(sourceConnection,sqlBulkcopyOptions.Default,transaction)) { bulkcopy.BatchSize = 50; bulkcopy.DestinationTableName = "dbo.foobar"; bulkcopy.Writetoserver(dt); } transaction.Rollback();

传递sqlBulkcopyOptions.UseInternalTransaction失败,出现错误

不得指定sqlBulkcopyOption.UseInternalTransaction并同时传递一个外部事务。

我想知道如果一个SET IMPLICIT_TRANSACTIONS ON;可能会有所作为SET IMPLICIT_TRANSACTIONS ON; 之前已经在连接上运行以关闭自动提交模式,但接受连接对象的sqlBulkcopy构造函数的重载将返回“意外的现有事务”。 无论如何这两种情况都是错误的 – 并且接受连接字符串的重载只会创建一个新的连接。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐