0

我有第三方提供的身份证号码列表。目前让我们假设这些数字没有任何顺序或增量算法。当多个人可能同时尝试相同的事情时,我如何根据请求安全地分配号码?我所想到的一切,我也可以想出一个失败的条件。

我为此使用 c# 和 sql server。

EG:将数字添加到具有自动生成的标识列的表中,然后将该标识与具有标识号列表的表匹配 - 不好,因为存在重新分配标识号的可能性,并且标识列可能无论出于何种原因,与 id 表不同步。

4

2 回答 2

0

我一直看到它的做法与此类似:首先生成 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
于 2013-01-21T14:00:30.690 回答
0

好吧,如果我给你一个最简单的方法,一个 Table ThirdPartyID (PK) UserID (FK) (or session ?) TimeAllocated DateTime 然后存储 procs 来分配和解除分配

使用时间列查找由于某些故障而分配的时间超过合理时间的时间。如果您正在使用会话,并且您很高兴在删除它时释放第 3 方 ID,那么当您整理死会话时,级联将代替您完成这项工作。

制作这个永远不会失败的傻瓜证明会变得非常昂贵,事实上,给定一个有限的 ID 列表,你可能会用完,所以根本不可能。

想一想,你不会为一个用户提供一个以上的 id,或者为一个以上的用户提供一个 id。从理论上讲,您可能会遇到密钥违规,但重试应该在几乎所有情况下都会对其进行排序。开始简单,看看会发生什么。

于 2013-01-21T15:04:49.520 回答