У меня есть несколько хранимых процедур (Добавить и удалить), которые выполняют выборку, вставку, удаление и обновление некоторых таблиц. Эти кажутся прекрасными.
Каждый из этих процессов использует ТРАНЗАКЦИЮ. Я начинаю транзакцию до того, как внесу какие-либо изменения в данные, и ближе к концу процесса я это делаю.
IF @@TRANSCCOUNT > 0
COMMIT TRANSACTION @transName;
В процедурах добавления и удаления и в ТРАНЗАКЦИИ я вызываю другую хранимую процедуру (Adjust) для обновления таблицы, в которой хранится текущий итог значений. Я нахожу, что это выходит из синхронизации .....
Вот тело этого процесса....
INSERT INTO L2(ProductId, LocationId, POId, StockMoveId, BasketId, OrderId, AdjusterValue, CurrentValue)
SELECT TOP 1
@ProductId, @LocationId, null, null, @BasketId, null, @Value, (CurrentValue + @Value)
FROM L2
WHERE 1=1
AND LocationId = @LocationId
AND ProductId = @ProductId
ORDER BY Id Desc
ProductId, LocationId, StockMoveId и OrderId — все это внешние ключи к соответствующим таблицам, но они допускают нули, поэтому только соответствующий ключ необходимо заполнить фактическим значением.
Вот изображение, показывающее пример того, где что-то идет не так....
19 должны были быть добавлены к 324, чтобы получить новое общее количество 343, однако, как вы можете видеть, кажется, что оно было добавлено к 300, а 319 вставлено.
Вопросы... Действительно ли это в транзакции, которая была начата в вызывающей хранимой процедуре.
Как я могу предотвратить эту ситуацию?
Я пытался использовать MAX, чтобы получить правильную строку, чтобы попробовать и ускорить, но план выполнения для этого не так эффективен с точки зрения затрат, как простой TOP. ID, кстати, это столбец Identity и PKey.
Нужно ли мне заблокировать таблицу, и если я это сделаю с другим процессом, вызывающим Adjust, подождите, или они будут ошибаться.
Любая помощь высоко ценится.
Дополнительная информация.... Я экспериментировал, и, похоже, единственное решение, которое постоянно работает так, как хотелось бы, - это иметь столбец Id в качестве поля INT и просто увеличивать его самостоятельно при INSERT. Меня это не устраивает, так как мне не понятно, почему столбец IDENTITY n не справляется.
Я сам пробовал опубликованное решение столбца Identity, последовательности и увеличивающийся идентификатор.