2012-11-17 31 views
4

有一個名爲Accounts表看起來像這樣:併發更新在ASP.NET或SQL Server 2008處理

AccountID AccountName AccountTotalMoney 
------------------------------------------- 
    1   Steven   600 
    3   Scott   800 

但用戶可以在同一時間像下面現在更新該行記錄:

User A:UPDATE Accounts SET AccountTotalMoney=700 WHERE AccountID=1; 
User B:UPDATE Accounts SET AccountTotalMoney=900 WHERE AccountID=1; 
User C:UPDATE Accounts SET AccountTotalMoney=1000 WHERE AccountID=1; 
. 
. 
. 

所以我想阻止多個用戶同時更新同一條記錄。 只是一個接一個。

我是這方面的新手。對不起,我的英語不好。提前致謝!

回答

5

有很多的可能性。

[觀點:我認爲,大多數Web應用程序做樂觀併發處理]:

在樂觀併發處理一個很好的教程在這裏找到: http://msdn.microsoft.com/en-us/library/bb404102.aspx

小摘要:

同樣,當兩個用戶正在訪問一個頁面,當一個用戶被另一個用戶刪除時,他可能正在更新記錄。或者,在用戶加載頁面和單擊「刪除」按鈕時,另一用戶可能已修改該記錄的內容。

有三種併發控制策略可供選擇:

  • 什麼都不做 - 如果併發用戶修改同一個記錄,讓最後提交的勝利(默認行爲)。 •
  • 樂觀併發 - 假設雖然可能存在併發衝突,但絕大多數情況下這種衝突不會發生;因此,如果出現衝突,只需通知用戶他們的更改無法保存,因爲其他用戶修改了相同的數據。
  • 悲觀併發 - 假設併發衝突是司空見慣的,並且用戶不會容忍被告知他們的更改沒有因其他用戶的併發活動而被保存;因此,當一個用戶開始更新記錄時,將其鎖定,從而阻止其他用戶編輯或刪除該記錄,直到用戶提交修改。
5

我覺得Pleuns答案很好。更具體:

  • 樂觀concurrencey - 檢查該行處理不當改變,做回退,如果它沒有。示例:添加每次更新後增加的版本列,並檢查執行更新時版本號是否相同。

  • 悲觀併發:更復雜。使用事務級別IsolationLevel.Serializable來鎖定行,但當事務跨越多個Web請求時,這不是一個好主意。