3

同時エントリーが多い大会を実施しています。私はいくつかのユーザー データを収集しており、それをエントリと呼ばれる 1 つのテーブルに入れています。discountCodes というテーブルに、事前に生成された一意の割引コードの別のテーブルがあります。次に、各エントリに 1 つ割り当てます。私は、discountCodes テーブルにエントリ ID を入れることでこれを行うと考えました。

多くの同時ユーザーが存在する可能性があるため、割り当てられていない最初の行を選択し、その行にエントリ ID を割り当てる必要があると思います。割り当てられていない行を選択してからエントリ ID を追加するまでの間に、別のスレッドが同じ行を見つけられないことを確認する必要があります。

行が 2 回割り当てられないようにする最善の方法は何ですか?

4

5 に答える 5

0

sp_getapplockを試して使用し、書き込み操作を同期することができます。次のように、同じハッシュに対してロックすることを確認してください。

DECLARE @state    Int

BEGIN TRAN

-- here we're using 1 sec's as time out, but you should determine what the min value is for your instance
EXEC @state = sp_getapplock 'SyncIt', 'Exclusive', 'Transaction', 1000

-- do insert/update/etc...

-- if you like you can be a little verbose and explicit, otherwise line below shouldn't be needed
EXEC sp_releaseapplock 'SyncIt', 'Transaction'

COMMIT TRAN
于 2013-09-18T16:31:03.830 に答える
0
WITH    e AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (ORDER BY id) rn
        FROM    entries ei
        WHERE   NOT EXISTS
                (
                SELECT  NULL
                FROM    discountCodes dci
                WHERE   dci.entryId = ei.id
                )
        ),
        dc AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (ORDER BY id) rn
        FROM    discountCodes
        WHERE   entryId IS NULL
        )
UPDATE  dc
SET     dc.entryId = e.id
FROM    e
JOIN    dc
ON      dc.rn = e.rn
于 2013-09-18T15:56:14.273 に答える