从表中获取下一个ID值有时会返回重复项

时间:2013-02-18 20:03:32

标签: sql sql-server tsql

我有一个名为UniqueIDStore的表,它从数据库中给出了最后一次UniqueID。当应用程序需要唯一的id时,应用程序将执行以下存储过程并执行以下操作,

  1. UniqueID
  2. 获取最后UniqueIDStore
  3. 增加一个
  4. 将最新的UniqueID保存到UniqueIDStore表。
  5. 当应用程序从不同的数据库连接/ java进程执行此存储过程时,它会在某个时间返回重复的id,我不知道为什么。

    UniqueIDStore表:

    CREATE TABLE [dbo].[UniqueIDStore](
        [UniqueId] [bigint] NOT NULL
    ) ON [PRIMARY]
    

    存储过程是:

    CREATE    PROCEDURE [dbo].[GET_UniqueID] @blockSize int = 1 
    AS  
        DECLARE @uniqueId BIGINT;
        DECLARE C1 CURSOR local FOR SELECT UNIQUEID FROM UniqueIDStore FOR UPDATE OF UNIQUEID;
        OPEN C1;
        SELECT UNIQUEID FROM UniqueIDStore;
        FETCH C1 INTO @uniqueId;
        UPDATE UniqueIDStore SET UNIQUEID = @uniqueId + @blockSize;
        CLOSE C1;
    GO
    

    我不是SQL Server专家;有人可以帮我修复存储过程来同步请求吗?

1 个答案:

答案 0 :(得分:0)

您的存储过程未使用交易,因此您不能保证其他人不会在您之后读取相同的号码,而是在您存储新值之前。

在SQLServer中,您可以使用identity来处理主键生成,如下所示:

create table something (
   id identity int,
   something varchar(50)
);

然后,你可以这样做:

 insert into something values ('something');
 insert into something values ('something else');

可能会得到这样的东西:

| id | something      |
|  1 | something      |
|  2 | something else |