2016-03-02 45 views
1

我检讨一些代码,其使用存储过程中插入一些数据到MSSQL数据库(MSSQL2014)。ADO.NET SQL事务 - 只有1个调用数据库?

每个到该数据库中的呼叫数据结果的行。

这是由于许多原因明显低效;其中最重要的是必须通过网络为每一行数据进行调用。

我surmising,如果他们只是包装所有这些单独的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参数。然而,这将需要重新分解数据库存储过程。

在此先感谢

+0

这可能是因为数据要插入的每一行,如果一行失败,也可以是_Rollbacked_。所以那些被插入的将仍然保留在数据库中。 –

+2

将不会有批次插入。所有的交易都会让你有能力提交插入,以便其他人能够看到变化。没有性能提升,如果有任何性能下降。不知道你想在这里做什么,这将很难给你一个正确的答案。 –

+0

@CraigSelbert - 似乎你刚刚回答了我的问题。我试图通过减少对数据库服务器的往返调用来减少客户端和服务器之间的网络延迟的影响,但如果我要正确解释您的答案,交易将无助于实现此目的。 –

回答

0

将不会有批量插入。所有的交易都会让你有能力提交插入,以便其他人能够看到变化。没有性能提升,如果有任何性能下降。不知道你是想在这里做什么这将是很难给你一个正确的答案

1

不会有批量插入。客户端和服务器都不会优化整个语句。 ADO.NET没有机器来理解您发送的SQL。它不能优化任何东西。服务器可以但不。

使用这样的事务会带来性能上的提升,因为只要事务处于挂起状态,插入就不需要刷新日志。