SQL Server:存储过程中的并发问题

时间:2015-12-14 21:06:21

标签: sql-server stored-procedures concurrency

我正在SQL Server 2008中实现序列,我找到了this article form MSDN Blog

在存储过程usp_GetNewSeqVal中,作者正在获取下一个序列:

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

这对我来说似乎有问题,似乎缺少行锁可能会产生并发问题。

但在文章中他说:

并发 - 扩展过程的执行不在DML语句的事务范围内,并且它在表示序列号的行上持有非常短的持续时间锁。

这里是否存在并发问题?

如果是这样如何解决?

1 个答案:

答案 0 :(得分:1)

,有 NO 并发问题!这就是为什么它是如此优雅的解决方案!

UPDATE语句会在读取现有值时锁定Update(U) - 并且U锁定已经独占 update 无法继续进行此操作。如果第二个连接也尝试更新同一个计数器,则必须等待,直到第一个UPDATE语句完整完成。

然后将锁升级为独占(X)锁以写回新值,同时将其存储到@NewSeqVal变量中。

使用单个,原子UPDATE 可以防止 出现任何并发问题!