0

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

  1. UniqueIDUniqueIDStore表中获取最后一个
  2. 加一
  3. 将最新的保存UniqueIDUniqueIDStore表中。

当应用程序从不同的数据库连接/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 专家;有人可以帮我解决这个修复存储过程以同步请求吗?

4

1 回答 1

0

您的存储过程未使用事务,因此您无法保证其他人不会在您之后读取相同的数字,但在您存储新值之前。

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

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 | 
于 2013-02-18T20:43:09.903 回答