2016-03-02 47 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。它不能優化任何東西。服務器可以但不。

使用這樣的事務會帶來性能上的提升,因爲只要事務處於掛起狀態,插入就不需要刷新日誌。