Vấn đề là nơi bạn có nhiều hàng đang được chèn, bạn đang sử dụng cùng một ID có sẵn tiếp theo cho tất cả các hàng, bạn cần thêm ROW_NUMBER()
để đảm bảo xid là duy nhất trong phần chè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];
Về việc ngăn chặn các bản sao, bạn có thể sử dụng các gợi ý về bảng để khóa xtable
khi nhận được xid
tối đa .
Hạn chế của việc sử dụng những ổ khóa này là bạn sẽ bị bế tắc. Bạn nên có một ràng buộc / chỉ mục duy nhất trên cột này vì điều này sẽ ngăn chặn các bản sao, tuy nhiên, nó cũng sẽ dẫn đến các trường hợp ngoại lệ khi một điều kiện chủng tộc được đáp ứng. Cuối cùng, bất kỳ phương pháp nào bạn chọn, bạn sẽ cần phải hy sinh.