0

第三者から提供された ID 番号のリストがあります。ここでは、数値が任意の順序またはインクリメンタル アルゴリズムではないと仮定します。複数の人が同時に同じことを試みる可能性がある場合、リクエストに応じて安全に番号を割り当てるにはどうすればよいですか? 私が考えたすべてのことは、それが失敗する条件を思いつくこともできます.

これにはc#とsqlサーバーを使用しています。

例: 自動生成された ID 列を使用してテーブルに番号を追加し、ID 番号のリストを使用してその ID をテーブルに一致させます。ID 番号の再割り当てが必要になる可能性があり、ID 列が何らかの理由で id テーブルと同期しなくなります。

4

2 に答える 2

0

最も単純なアプローチとして、テーブルThirdPartyID(PK)UserID(FK)(またはセッション?)TimeAllocated DateTime次に、ストアドプロシージャを割り当てて割り当てを解除します。

[時間]列を使用して、何らかの障害が原因で適切な時間よりも長く割り当てられているものを探します。セッションを使用していて、削除されたサードパーティIDを解放できる場合は、デッドセッションを整理するときにカスケードが代わりに機能します。

このばかげた証拠を失敗することは決してないので、非常に高額になる可能性があります。実際、IDのリストが限られていると、不足する可能性があるため、まったく不可能です。

1つは、ユーザーに複数のIDを割り当てたり、複数のユーザーにIDを割り当てたりしないことです。理論的にはキー違反が発生する可能性がありますが、ほとんどすべての状況で再試行する必要があります。簡単に始めて、何が起こるか見てみましょう。

于 2013-01-21T15:04:49.520 に答える
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 の代わりに ID 列を使用する簡単な方法を示します。Bertrand が指摘したように、ストレージ コストが少なくて済みます。これは、サード パーティの番号を ID 列として 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 に答える