0
似乎經常詢問這個話題,而且我認爲我找到了一個answer作爲我原來的問題,但現在我很好奇這個(和我發現了一些其他的答案),我的SQL:用於WHERE子句和子SELECT的UPDATE的SQL Server鎖定
update Foos set Owner = 'me' OUTPUT INSERTED.id where Owner is null and id in
(select top 1 id from Foos where Owner is null)
我現在明白了,我的原假設是正確的關於子選擇和併發性,在併發線程可以select
相同id作爲另一個線程即將update
那個ID。但是,update
件中的where
子句是否有助於防止這種競爭條件(在read committed
級別)?
我的理論是,當兩個線程可以從子select
得到相同的ID,只有一個將能夠update
,因爲update
是原子,包括條件。另一個線程會失敗,或更新零記錄。真的嗎?
哎呀看起來也許這應該已經張貼在DBA?從來不知道存在...... – Josh 2014-09-29 16:23:42
除了併發性問題之外,您正在做一個沒有訂單的前1名。除非您指定訂單,否則您可能無法獲得相同的1。 – 2014-09-29 16:30:12