El problema es que cuando se insertan varias filas, está utilizando el mismo ID disponible para todas las filas, debe agregar ROW_NUMBER()
para asegurarse de que el xid fuera único en la inserción:
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];
Con respecto a la prevención de duplicados, puede usar sugerencias de tabla para bloquear xtable
al obtener el máximo xid
.
El inconveniente de usar estos bloqueos es que obtendrá un interbloqueo. Debe tener una restricción/índice único en esta columna, ya que esto evitará duplicados; sin embargo, también generará excepciones cuando se cumpla una condición de carrera. En última instancia, sea cual sea el método que elija, tendrá que hacer algún tipo de sacrificio.