2016-02-05 88 views
1

我有一個數據庫表中的列,當我們說某些項被選中時,必須增加一列。但它可以被並行選擇,並且它必須從0開始的任何記錄。我的解決方案是從DB過程中增加值,但是我可以確定第一個過程設法在另一個過程需要加載值之前增加該值增加?我的意思是:從SQL Server:通過過程調用增加非標識int列

寫PROCEDURE1回
t0 Value is 10 
t1 Procedure1 valueToInc = Value 
t2 Procedure2 valueToInc = Value 
t3 Procedure1 valueToInC++ 
t4 Procedure2 valueToInC++ 
t5 Value = 11 
t6 Value = 11 

值是11,但是從過程2顯然也是11(需要保護12那裏)。

我也檢查過身份(屬性)和序列(Transact-SQL),但沒有任何東西似乎適合我。

編輯

什麼我正嘗試解決的是,我有一個控制檯應用程序 - TCP服務器和MSSQL數據庫,在那裏我有一個用戶表。每次單個用戶想要登錄時,我都必須增加用戶的loginCount字段。我知道,在這裏任何並行都不應該是可行的,或者可以從代碼管理,但有人告訴我必須通過數據庫來處理並行訪問,所以不僅僅是使用更新查詢。我有它作爲求職面試項目...

我想通過我的第一個解釋讓理解更容易,但它不會工作。

+0

你是說你有一列,並不斷需要通過加1來改變它的值?身份不會在那裏幫助。我不得不說我從來沒有聽說過這樣的要求。無論你做什麼,你都需要處理併發問題,這取決於你真正想要做什麼,可能會非常具有挑戰性。 –

+0

謝謝你的評論。我不確定是否經常是正確的詞,但有時會發生,一次兩個文件將是必要的,以處理 –

+0

是否需要知道一行已被「選擇」多少次?從字面上選擇或者你的意思是用戶「挑選」在某處使用?還是這是一個樂觀的併發工具? – paulbarbin

回答

1

你可以使用

UPDATE Users 
SET LoginCount = ISNULL(LoginCount,0) + 1 
WHERE UserId = @UserId 

這是併發的條件下完全安全的。

+0

謝謝你的回答。它很好地顯示http://stackoverflow.com/questions/34975139/is-update-command-thread-safe-tracking-revisions-in-ms-sql。 –

0

使用事務隔離級別等於SERIALIZABLE的事務。

SERIALIZABLE

  • 聲明不能讀取已修改但其他事務尚未提交的數據。
  • 沒有其他事務可以修改當前事務讀取的數據,直到當前事務完成。
  • 其他事務不能插入具有鍵值的新行,這些鍵值落在當前事務中任何語句讀取的鍵的範圍內,直到當前事務完成。

不要加載Value遞增它:增加它,然後選擇它(在事務內)。這將鎖定表/行(取決於)更新/選擇其他事務。