English

Начальные условия.

Есть 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 думает что это разрыв соединения и откатывает транзакцию.

Прошлые записи

  1. Детализация по звонкам Теле2, совершенным более полугода назад
  2. Побыть туристом в своем городе
  3. Космология, Байкал, Математика, Минимализм
  4. Уроки математики - Youtube-канал
  5. Почему я считаю, что бойкотировать выборы это плохая идея
  6. Ксения Собчак в гостях у Познера
  7. Один из способов решения психологических проблем в семье
  8. Стрельба из пистолета Ярыгина
  9. Опыт участия в Teamlab в роли наставника
  10. Highload 2017. Как это было.
  11. Авиатор. Е. Водолазкин. Отзыв