Problemet er, at hvor du har flere rækker ved at blive indsat, bruger du det samme næste tilgængelige ID for alle rækker, du skal tilføje ROW_NUMBER()
ind for at sikre, at xid'et var unikt i indsættelsen:
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];
Med hensyn til at forhindre dubletter kan du bruge tabeltip til at låse xtable
når du får den maksimale xid
.
Ulempen ved at bruge disse låse er, at du vil få deadlocking. Du bør have en unik begrænsning/indeks på denne kolonne, da dette vil forhindre dubletter, men det vil også resultere i undtagelser, når en race-betingelse er opfyldt. I sidste ende, uanset hvilken metode du vælger, bliver du nødt til at give en form for ofre.