sql-server-2008 – 通过存储过程模拟TSQL序列

前端之家收集整理的这篇文章主要介绍了sql-server-2008 – 通过存储过程模拟TSQL序列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要创建一个模拟Tsql序列的存储过程.也就是说,它总是在每次调用时给出一个增加的不同整数值.此外,如果传入一个整数,则应该返回该值,如果从未有过更大的结果或下一个可用的最高整数.不用说,可以有多个客户端同时调用此SP.

给定一个包含MetaKey varchar(max)和MeatValueLong bigInt列的MetaInfo表.期望MetaKey为’Internal-ID-Last’的行将包含分配的最后一个最高值.我创建了以下存储过程:

CREATE PROCEDURE [dbo].[uspGetNextID]
(
  @inID bigInt 
)
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRANSACTION

    UPDATE MetaInfo WITH (ROWLOCK) 
      SET MetaValueLong = CASE 
                            WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1 
                            ELSE @inID+1
                          END 
    WHERE MetaKey = 'Internal-ID-Last'

    SELECT MetaValueLong 
    FROM MetaInfo
    WHERE MetaKey = 'Internal-ID-Last'

    COMMIT TRANSACTION 

END

我的问题很简单,这个存储过程是否按预期工作(所有呼叫者将被分配一个唯一的结果)?

解决方法

我看过了,MS自己提供了一个没有锁的解决方

http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx

这是一个没有锁定提示的简单更新,但是他们说它锁定/死锁.

关于这一点也没什么特别的.

我倾向于将UPDLOCK添加到您的ROWLOCK(根据“table as a queue” (SO)但没有READPAST).如果第二个过程开始读取,这将增加隔离.

但是,所有你的进程想要读/写同一行的事实让我自己猜测. READPAST允许安全并发,但在这种情况下它是无用的.

注意:您可以使用OUTPUT子句而不是第二次选择,然后您不需要事务.

HTH …

猜你在找的MsSQL相关文章