2013-02-04 48 views
0

我有以下的情況,我希望處理:如何處理兩筆交易在SQL Server更新同一行

值表:

id int 
val varchar(20) 
used bit 
flag int 

我想找到第一行WHERE used = 0 AND標誌爲NULL,並將某些內容粘貼到「標誌」中。一旦做到這一點任何其他用戶將無法使用該行(因爲標誌不爲null)

這是很簡單的做,當然:

UPDATE top (1) mytable 
SET flag = someUniqueValue 
WHERE used = 0 
    AND flag IS NULL 

我想知道的是,如果發生了什麼兩個用戶同時運行相同的UPDATE。很明顯,一個人會先到達那裏。

我不知道如何去測試這個場景,所以找不到我自己。

第二位用戶是否超過第一位? (直接或在鎖定釋放後?)

第二個用戶被鎖定並出現錯誤? (如果是這樣,我怎麼去檢測錯誤?)

任何幫助,將不勝感激。

回答

0

好吧,經過一些研究,我找到了我自己的答案。

看來我必須鎖定表,執行我的更新,然後釋放表鎖。下面的SQL做了這一切一氣呵成:

UPDATE top (1) mytable WITH (TABLOCKX) 
SET flag = someUniqueValue 
WHERE used = 0 
    AND flag IS NULL 

爲了測試它,我跑了兩個循環(每10000次循環 - 一個比最高位,但確實起作用)。第一個循環卡住了一個值,第二個值。最終結果顯示,當兩個循環完成運行時,表中每個值都有10000個值。

1

第二位用戶將超過第一位。它不會被鎖定,除非被包含在交易中。 檢查這個link ....

+0

是 - 最終發現 – Graham