Problem polega na tym, że gdy wstawiasz wiele wierszy, używasz tego samego następnego dostępnego identyfikatora dla wszystkich wierszy, musisz dodać ROW_NUMBER()
in aby upewnić się, że xid był unikalny we wstawce:
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];
Jeśli chodzi o zapobieganie duplikatom, możesz użyć wskazówek tabeli, aby zablokować xtable
przy pobieraniu maksymalnego xid
.
Wadą korzystania z tych zamków jest to, że otrzymasz zakleszczenie. Powinieneś mieć unikalne ograniczenie/indeks w tej kolumnie, ponieważ zapobiegnie to duplikatom, ale spowoduje również wyjątki, gdy spełniony zostanie warunek wyścigu. Ostatecznie, niezależnie od wybranej metody, będziesz musiał dokonać pewnego rodzaju poświęcenia.