2013-08-30 87 views
2

我有一個使用HTML5畫布的HTML5前端。畫布顯示一組用戶可以操作的圖像(移動它們),然後單擊「保存」。 '保存'然後發送圖像數據列表,如x,y座標到asmx網絡服務。SQL Server插入與刪除並提交事務

此刻:我正在刪除會話的所有記錄並重新插入新記錄,但是如果會話從未保存過,那麼我將插入。

我的第一個問題是,它是建議刪除並插入或只是運行更新。哪一個計算密度較低?

其次,我想確保所有的會話數據都被提交,即如果我發送46行數據,我想確保它們被寫入。在刪除/插入場景中,刪除可能會繼續,而插入可能會失敗。

如何使用交易完成此操作。

此刻,我只是使用實體框架,選擇會話數據,刪除它,然後重新插入數據。

任何指針將不勝感激。

回答

1

我的第一個問題是,它是建議刪除並插入或只是運行更新。哪一個計算密度較低?

更新比刪除和插入便宜。原因是磁盤的瓶頸(不是計算)。插入和刪除在磁盤上的頁面中分配和釋放字節,可能需要更新一個或兩個索引。更新將使它們保持原樣並僅更改幾個字節,因此IO更少。除此之外,插入和刪除是兩個操作(+這會影響任何索引),而不是更新。 (還有一些額外開銷用於按順序記錄)

如果你在sql2008或更高版本上,你可以使用table valued parameters,這些對於你所描述的應用來說非常好,因爲你可以在一次往返中將你的整個更新設置發送到sql。如果您使用常規更新語句,則需要運行46個語句。

如果您確實想調整它,您可能還需要查看combining the TVP's with the merge statement以在單個操作中處理更新和插入的組合。

話雖如此,你可能只想使用在你的代碼中最簡單的工作。如果你沒有性能問題,你不必修復它。

其次,我想確保所有的會話數據都被提交,即如果我發送46行數據,我想確保它們被寫入。在刪除/插入場景中,刪除可能會繼續,而插入可能會失敗。

實際上,您可以使用事務來更新或刪除/插入。

begin tran 

delete * from table where some condition 

insert into table (value1, value 2) values (1, 2), (3, 4) .. 

commit tran 

這將成爲一個整體或不改變數據庫。這也適用於使用表值參數。

+0

多數民衆贊成真棒指針。使用我以前的場景可能會在以後很多用戶使用該系統時出現問題,所以我現在要實現它。是否可以在.NET代碼中執行開始轉換,還是必須駐留在評分過程中。 – user1144596

+0

你也可以從代碼中調用它們:http://msdn.microsoft.com/en-us/library/2k2hy99x.aspx – gjvdkamp

+0

我的意思是表格值參數,它們只能駐留在存儲過程中嗎? – user1144596

0

檢查出MERGE聲明連同臺灣居民入境許可證

我還創建了一個臨時表和使用的SqlBulkCopy類(後面當然合併),效果良好。 SqlBulkCopy通常用於更多的行,但使用起來很簡單(比TVP更容易),所以在這些情況下不會使用它。

另一種選擇是做一個臨時表和大量的插入,然後進行合併。通過一次往返發送所有說明,您將獲得良好的表現。如果你願意,你也可以做46個合併語句 - 你必須做一個內聯選擇你的值。

在所有情況下,交易都是合適的,但對於前兩個交易來說不是必須的,因爲MERGE是原子的。如果你開始做更多的事情,仍然是一個好習慣。

+0

請注意,如果沒有適當的鎖定,MERGE不是原子的。見[這裏](http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx)。 – HABO