Использование SQL 2016.
У меня есть таблица Orders:
OrderID int identity
NumberOfItems int
и таблица Items:
ItemId int identity
OrderId int
DateUpdated datetime
Заказ создан, а идентификатор заказа:назначается через личность.Затем я должен назначить ему элементы «Freshest» «NumberOfItems» из таблицы «Элементы».Самое свежее, они были обновлены самыми последними, в соответствии с датой DateUpdated.Элементы «назначаются» путем обновления их OrderId до рассматриваемого OrderId.
У меня есть этот SQL для назначения элементов транзакционным способом (@OrderID и @NumberOfItems являются входными параметрами):
UPDATE Items
SET OrderId = @OrderId
WHERE ItemId IN
(SELECT TOP(@NumberOfItems) ItemId FROM Items
WHERE OrderId IS NULL -- not already assigned
ORDER BY DateStatusUpdated DESC -- freshest first
)
Должно быть хорошо, верно?Это должно транзакционно назначать Предметы заказам, и независимо от того, как часто или одновременно этот оператор выполняется на сервере, этот же Товар никогда не должен быть переназначен другому заказу, если он уже был назначен.Это должно быть гарантировано практически любой реляционной базой данных, когда-либо реализованной из-за необходимой транзакционной природы одного используемого оператора UPDATE.
Что ж, он работал таким образом для нескольких десятков миллионов заказов.Затем, прошлой ночью, два заказа пришли на расстоянии около 50 мс (что не особенно близко для этого приложения), и один Предмет был назначен на OrderN, а затем тот же самый предмет переназначен на OrderN + 1 !!
Что могло вызвать это?