2016-06-14 33 views
-1

我正在處理會計項目並面臨併發更新問題。我按照下面方案
1)用戶1檢索COLUMN1數據
2)用戶2還檢索COLUMN1數據
3),同時更新用戶2列1的數據用戶1更新列1數據
4)我必須告訴用戶列1的數據是已經更新請刷新細節&如果從原始修改更新。併發問題,當更新sql服務器表列

,我不希望從檢索其已經被用戶1,檢索如何處理這種類型的併發或任何內建的功能在SQL Server中提供的數據限制用戶2

+0

您可以[設置事務隔離級別(http://sqlperformance.com/2014/07/t-sql-queries/isolation-levels) – stuartd

回答

2

重申你的問題我的理解是:

  1. 用戶1 retrived COLUMN1數據
  2. 用戶2也retrived COLUMN1數據
  3. 用戶1更新COLUMN1數據
  4. 用戶2要更新列1上的陳舊數據。您希望提醒用戶2數據已過時,用戶2應該執行刷新(獲取最新值),然後再次更新。

這正是rowversion的用途。您將此記錄添加到新記錄中。每當數據在記錄上發生變化時,Sql服務器將處理分配值並增加它們。您應該檢索該值以及該記錄的其他相關詳細信息,然後將其包含在更新聲明中。如果值不匹配,則表示存在併發性錯誤,則記錄在用戶檢索數據的最後一次和希望更新數據的時間之間更新。

另請注意,在這種情況下,任何時候對記錄進行任何更改都會改變rowversion,而不僅僅是針對該特定列。

在表中執行rowversion後的邏輯。

  1. 任何用戶檢索數據COLUMN1也檢索記錄的rowversion值
  2. 任何用戶更新COLUMN1數據包括UPDATE語句的WHERE子句中的rowversion值。
    1. 如果受影響(更新)的記錄數爲0,則不會發生更新,因爲記錄已由檢索和更新之間的另一個連接更新。在這種情況下,執行邏輯以顯示錯誤消息並檢索更新的數據以及新的rowversion值。 (或者該記錄已被刪除,但假設情況並非)。
    2. 如果受影響(更新)的記錄數爲1,則更新成功。記錄的rowversion值也發生了變化。如果您想在不進行完整數據刷新的情況下允許其他更新,請務必將更新後的rowversion返回給用戶。