Начальные условия.
Есть 3 хранимых процедуры: Clear, Add, Process. Первая Clear чистит таблицу Servs (удаляет строки у которых processFlag = 0).
Вторая Add добавляет записи в таблицу c processFlag = 0, третья Process запускает обработку строк, у которых processFlag = 0 и ставим им processFlag = 1.
Все это дело выполняетс я в транзакции и в случае ошибок возвращается в исходное.
Описание проблемы
На некоторых данных срабатывал откат транзакции и данные из таблицы не обрабатывались.
В таблице были записи, у которых processFlag = 0, то есть необработанные, хотя Process процедура была вызвана (смотрели в профайлере).
Решение
Я проверял корректность по результату result от процедур. Если result = 0 значит все ок, иначе ошибка. Также смотрел на дедлоки. Оказалось так, что в процедуре Process был вызов других процедур, которые также возвращали result.
Получалось примерно следующее: драйвер открывает соединение, шлет запрос, получает ответ от какой-то внутренней процедуры, думает что ответ получен и закрывает соединение. При это со стороны mssql происходит следующее: mssql думает что это разрыв соединения и откатывает транзакцию.
Прошлые записи
- Эволюция веб-приложений. От статичного HTML до Single Page Application и Progressive Web Application
- Переезд в Калининград
- Была ли спецоперация на Украине неизбежна?
- О serverless технологии для чатботов
- Свободное время на улучшение блога
- o-zhizni-v-kaliningrade-spustya-god
- Продажа гаража из другого города
- В Калининграде спустя полгода
- Выйти на работу или сидеть дома
- Теперь мы живем в старой немецкой квартире и счастливы
- Как за один день найти жилье в августе 2020 (после пандемии) и чуть не остаться на улице с двумя детьми