2015-12-14 105 views
2

我在SQL Server 2008中執行順序,我發現this article form MSDN BlogSQL服務器:在存儲過程中的併發性問題

在存儲過程usp_GetNewSeqVal,筆者得到一個序列是這樣的:

update AllSequences 
set @NewSeqVal = CurrVal = CurrVal+Incr 
where SeqName = @SeqName 

這對我來說似乎有問題,似乎缺少行鎖可能會產生併發問題。

但在文章中他指出:

併發 - 擴展程序的執行是不是DML語句的事務範圍內,並且其持有代表該序列號的行持續時間很短的鎖。

是否有併發的問題嗎?

如果是的話如何解決?

回答

1

,有併發問題!這就是爲什麼它是如此優雅的解決方案!

在讀取現有的價值UPDATE聲明將採取Update(U)鎖 - 和U鎖已經是在第二update不能在這一點上進行獨家。如果第二個連接也嘗試更新同一個計數器,則必須等待等待,直到第一個UPDATE聲明完成。

該鎖然後升級到獨佔鎖(X),而在同一時間將其存儲到@NewSeqVal可變寫回新值。

此使用的,原子UPDATE防止任何併發問題!

+1

防止一些併發問題。但是如果原子更新是更大交易的一部分,並且有足夠的大交易需要進行更新,那麼這可能是瓶頸。 –