2015-12-14 77 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

防止一些并发问题。但是如果原子更新是更大交易的一部分,并且有足够的大交易需要进行更新,那么这可能是瓶颈。 –