我有第三方提供的身份证号码列表。目前让我们假设这些数字没有任何顺序或增量算法。当多个人可能同时尝试相同的事情时,我如何根据请求安全地分配号码?我所想到的一切,我也可以想出一个失败的条件。
我为此使用 c# 和 sql server。
EG:将数字添加到具有自动生成的标识列的表中,然后将该标识与具有标识号列表的表匹配 - 不好,因为存在重新分配标识号的可能性,并且标识列可能无论出于何种原因,与 id 表不同步。
我有第三方提供的身份证号码列表。目前让我们假设这些数字没有任何顺序或增量算法。当多个人可能同时尝试相同的事情时,我如何根据请求安全地分配号码?我所想到的一切,我也可以想出一个失败的条件。
我为此使用 c# 和 sql server。
EG:将数字添加到具有自动生成的标识列的表中,然后将该标识与具有标识号列表的表匹配 - 不好,因为存在重新分配标识号的可能性,并且标识列可能无论出于何种原因,与 id 表不同步。
我一直看到它的做法与此类似:首先生成 ID(可能是 guid),标记您的记录(锁定表以便您可以同时处理多个请求),然后提取数据。
DECLARE @ID UniqueIdentifier
SET @ID = NEWID()
--ProductTable contains third party ID information
UPDATE TOP(1) ProductTable
SET Assigned = 1,
ID = @ID
WHERE Assigned <> 1
SELECT
ThirdPartyID
FROM ProductTable
WHERE ID = @ID
如果您不想在 SQL 中执行此操作,也可以在 C# 中生成您的 guid
这是一种更简单的方法,您可以使用标识列而不是 GUID,正如 Bertrand 指出的那样,存储成本会更小。此假设您已将第三方号码加载到 ID 作为标识列的表中
DECLARE @ID INT
UPDATE TOP(1) ProductTable
SET Assigned = 1,
@ID = ID
WHERE Assigned <> 1
SELECT
ThirdPartyID
FROM ProductTable
WHERE ID = @ID
好吧,如果我给你一个最简单的方法,一个 Table ThirdPartyID (PK) UserID (FK) (or session ?) TimeAllocated DateTime 然后存储 procs 来分配和解除分配
使用时间列查找由于某些故障而分配的时间超过合理时间的时间。如果您正在使用会话,并且您很高兴在删除它时释放第 3 方 ID,那么当您整理死会话时,级联将代替您完成这项工作。
制作这个永远不会失败的傻瓜证明会变得非常昂贵,事实上,给定一个有限的 ID 列表,你可能会用完,所以根本不可能。
想一想,你不会为一个用户提供一个以上的 id,或者为一个以上的用户提供一个 id。从理论上讲,您可能会遇到密钥违规,但重试应该在几乎所有情况下都会对其进行排序。开始简单,看看会发生什么。