我有一个名为UniqueIDStore
的表,它从数据库中给出了最后一次UniqueID
。当应用程序需要唯一的id时,应用程序将执行以下存储过程并执行以下操作,
UniqueID
表UniqueIDStore
UniqueID
保存到UniqueIDStore
表。当应用程序从不同的数据库连接/ 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专家;有人可以帮我修复存储过程来同步请求吗?
答案 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 |