我正在SQL Server 2008中实现序列,我找到了this article form MSDN Blog
在存储过程usp_GetNewSeqVal
中,作者正在获取下一个序列:
update AllSequences
set @NewSeqVal = CurrVal = CurrVal+Incr
where SeqName = @SeqName
这对我来说似乎有问题,似乎缺少行锁可能会产生并发问题。
但在文章中他说:
并发 - 扩展过程的执行不在DML语句的事务范围内,并且它在表示序列号的行上持有非常短的持续时间锁。
这里是否存在并发问题?
如果是这样如何解决?
答案 0 :(得分:1)
否,有 NO 并发问题!这就是为什么它是如此优雅的解决方案!
UPDATE
语句会在读取现有值时锁定Update
(U) - 并且U
锁定已经独占 update
无法继续进行此操作。如果第二个连接也尝试更新同一个计数器,则必须等待,直到第一个UPDATE
语句完整完成。
然后将锁升级为独占(X)锁以写回新值,同时将其存储到@NewSeqVal
变量中。
使用单个,原子UPDATE
可以防止 出现任何并发问题!