2011-06-24 70 views
2

我在VB.NET 2.0中使用DataTables,並且正在編寫代碼來處理我期望在多用戶環境中發生的併發衝突。我瞭解如何捕獲併發衝突,但我不明白如何在使用DbCommandBuilder生成的INSERT,UPDATE和DELETE命令時解決它們。如何解決.NET中的DataTables的併發衝突問題?

這在我看來,併發衝突發生在五種不同的情況:

當...

  1. 更新已同時更新數據庫
  2. 更新,有一個行的行已同時從數據庫中刪除
  3. 刪除已在數據庫中同時更新的行
  4. 刪除已經被刪除的行目前從數據庫
  5. 插入行,其主鍵已經被同時插入到數據庫

我知道如何解決情況1刪除;我發現了幾個如何使用DataTable.Merge方法同步更新行的例子。但是,合併似乎不適用於其他4種情況。作爲一個例子,假設我試圖更新一個已經從數據庫中同時刪除的行(情況2),並且我的業務規則告訴我用更新的列值將行還原到數據庫中。我找不出如何更改DataRow屬性,以便Adapter.Update方法將根據需要將該行插入到數據庫中;合併不這樣做。

考慮到Merge處理情況1的方便性,我確定對其他併發違規也必須有簡單的解決方案,而我只是忽略了它們。任何人都可以向我提供正確的方向嗎?

-TC

回答

0

如果你要更新該行是由另一個進程刪除,需要恢復它,那麼你需要捕捉,當您嘗試更新,並通過插入反應發生的併發異常行回到數據庫:

  1. 保存更新的值。
  2. 將併發衝突合併到您的表中,這將刪除數據庫中已刪除的行。
  3. 用保存的值在表格中插入一個新行。
  4. 保存表格。
+0

David,謝謝你的回覆。不幸的是,我發現第2步不像你描述的那樣工作。將併發衝突合併到我的表中時,從數據庫中刪除的行不會從DataTable中刪除。 –

+0

另外,你提到這應該是爲了響應併發異常而完成的。但是,我發現併發異常是針對一次違規提出的,而必須一次完成整個表的合併。因此,在發生異常時處理違規行爲可能會導致錯誤地處理第二次或第三次違規行爲。正因爲如此,我得出結論:併發異常不能依靠發起響應,我必須先發制人地追捕違規行爲。我錯了嗎? –