@chelio0s я сделяль
Значит проблема была в чем - параллельно выполняющиеся транзакции гадят друг другу, изменяя общие ресурсы так, как им хочется, вразнобой. Из-за этого и возникали то левые данные, то взаимоблокировки, которые deadlock-и.
Решением может стать блокировка общего ресурса той транзакцией, которая к нему первая достучалась. То есть мы начинаем транзакцию, и тут же ставим блокировку на общий ресурс. Причем такую, что другие транзакции даже доступа на чтение не могут получить.
Конкретно в моем случае накладываем update-блокировку:
Запрос до:
SELECT @available = Quantity FROM Storage WHERE ProductId = @productId;
Запрос после:
SELECT @available = Quantity FROM Storage WITH(UPDLOCK) WHERE ProductId = @productId;
И у меня исчезли дедлоки и просчеты. Тестировал в 100 потоков.
Вот тут подробнее:
https://habr.com/ru/company/mindbox/blog/261661/