【发布时间】:2016-03-02 02:24:06
【问题描述】:
我正在查看一些使用存储过程将一些数据插入 MSSQL 数据库 (MSSQL2014) 的代码。
每一行数据都会调用该数据库。
由于多种原因,这显然是低效的;其中最重要的一点是,必须通过网络对每一行数据进行调用。
我推测,如果他们只是将所有这些单独的 sqlcommand 调用 (ExecuteNonQuery) 包装到一个事务中,那么这最终将导致某种“批量插入”。当您实际“提交”事务时,就会进行跨连接的调用。
这是正确的吗?这会在一次调用中将所有 sqlcommands 发送到服务器吗?我无法找到概述使用事务时客户端和服务器之间的通信的图表或文档。
--> Begin Transaction
-> ExecuteNonQuery
-> ExecuteNonQuery
-> ExecuteNonQuery
-> ExecuteNonQuery
-> ExecuteNonQuery
-> ExecuteNonQuery
-> ExecuteNonQuery
-> ...
--> Commit Transaction (my assumption is that each of the SqlCommands
are sent over the connection object at this point)
在旁注中,我更倾向于建议开发人员重写例程以使用 SQLBulkCopy 或 TableValued 参数。然而,这将需要重构数据库存储过程。
提前致谢
【问题讨论】:
-
这可能是因为对于您插入的每一行数据,如果有一行失败,它可能会被回滚。这样插入的那些仍将保留在数据库中。
-
不会有批量插入。事务将做的就是让您能够提交插入,以便其他人能够看到更改。没有性能提升,如果有任何性能受到影响。不知道你想在这里做什么,很难给你一个正确的答案。
-
@CraigSelbert - 看来你刚刚回答了我的问题。我试图通过最小化对数据库服务器的往返调用来减少客户端和服务器之间网络延迟的影响,但如果我要正确解释您的答案,事务将无助于实现这一点。
-
@CraigSelbert 如果您想将此记录为答案,请这样做,我会将其标记为答案。
标签: c# .net sql-server vb.net ado.net