問題は、複数の行が挿入されている場合、すべての行に同じ次の利用可能な ID を使用している場合、ROW_NUMBER()
を追加する必要があることです。 xid が挿入内で一意であることを確認します:
insert into [xtable] (XID)
select [x].[NextavailableID] + ROW_NUMBER() OVER (ORDER BY i.ID)
from inserted [i]
cross apply
(
select coalesce(max([t].[XID]), 0) [NextavailableID]
from [xtable] [t] WITH (TABLOCK, HOLDLOCK)
) [x];
重複の防止に関しては、テーブル ヒントを使用して xtable
をロックできます。 最大の xid
を取得するとき .
これらのロックを使用することの欠点は、デッドロックが発生することです。この列には一意の制約/インデックスが必要です。これにより重複が防止されますが、競合条件が満たされた場合にも例外が発生します。最終的には、どの方法を選択するにしても、何らかの犠牲を払う必要があります。