我们要求说,当我们将新人带入数据库时,我们需要为他们分配一个唯一的号码。系统上线时,此数字将从定义的数字开始。因此,如果客户说“从500,000开始!”,那么第一个分配的ID将是500000。
轻松 - 自动增加恶魔。
但是,此ID
是Account Number
,会发送到外部客户端以将此人链接到帐户。一个想法可能是使用auto inc主键,但我认为将PK用作面向外部的“人员号码”是很糟糕的。
有人提到有一个表,有一个auto inc pk,以及我们正在添加号码的人员表的id。但这似乎很奇怪。
我的想法是在我们的settings
表中添加一个新列,它实际上只有一行,并包含系统的系统设置。该列为INT
,称为NextAvailableId
。所有行都有Version
列,Timestamp
(RowVersion
)。
我的计划是创建一个名为GetNextId
的函数,它只会执行以下操作:
@AssignedID
@Version
NextAvailableId
以及版本。Set AssignedID = NextAvailableId
NextAvailableId = AssignedID + 1 WHERE version = @Version
这听起来像是一个安全有效的计划,可以将“帐号”分配给我的人吗?
请注意,它不是真正的人或帐户代码。它是一个供应商ID,需要应用于某个人才能存储在单独的系统中。仅使用人员和帐户作为(差)示例。
我需要做的是找到一种方法来处理“帐号”的唯一分配。如果手动方式是一个坏主意,并且有更好的方法 - 那么这将对我有很大帮助。
答案 0 :(得分:2)
虽然我不同意你手动增加最后一个ID的方法,但我同意marc_s你需要注意并发性。
我最快的方法是将您的函数中的事务与READ UNCOMMITTED
组合为隔离级别和小Mutex字段。这是伪代码:
READ UNCOMMITED
将允许多次执行检查Mutex标志的值,而其他事务仍在运行且尚未提交。
编辑:
我建议您添加一个新列,其中包含您使用的默认值而不是PK。示例如下:
CREATE FUNCTION dbo.GetLastId()
RETURNS INT
AS
BEGIN
RETURN SELECT MAX(AccountID) + 1 FROM dbo.tblUsers
END
-- Set the default value to the column
ALTER TABLE dbo.tblUsers
ADD AccountID SET DEFAULT (dbo.GetLastId())