n1ro°
RU

Ошибки · Решение

SQL Server ошибка 3930: что означает и как исправить

Транзакция перешла в uncommittable state: запись в журнал и COMMIT больше невозможны, поэтому её нужно полностью откатить.

Редакция N1RO · Проверено

Короткий ответ

Код 3930 означает uncommittable transaction: после предыдущей ошибки транзакция уже не может писать в log или выполнять COMMIT. Найдите первичную ошибку и сделайте полный ROLLBACK.

Что означает ошибка

Транзакция перешла в uncommittable state: запись в журнал и COMMIT больше невозможны, поэтому её нужно полностью откатить.

Возможные причины

  • Процедура не откатывает doomed transaction перед следующими изменениями.
  • Внутри транзакции произошла ошибка, после которой `XACT_STATE()` стал -1.
  • TRY/CATCH обработал исключение, но код продолжил выполнять write/COMMIT.

Что проверить

  • Проверьте `XACT_STATE()` в CATCH-блоке.
  • Найдите первичную ошибку, которая сделала транзакцию uncommittable.
  • Проверьте границы nested procedures и кто отвечает за BEGIN/COMMIT/ROLLBACK.

Безопасные шаги

  1. Исправьте обработку исключений так, чтобы COMMIT выполнялся только для committable transaction.
  2. После исправления тестируйте сценарий с той же первичной ошибкой, а не только happy path.
  3. При `XACT_STATE() = -1` выполните полный ROLLBACK.

Только безопасные обратимые действия. Опасные шаги — только по официальной инструкции и с пониманием рисков.

Когда нужен сервис

  • Если 3930 повторяется, нужен не сам код, а первичная ошибка, после которой XACT_STATE() стал -1. Передайте разработчику/DBA CATCH-блок, границы транзакции и исходное исключение.

Похожие ошибки

  • /errors/sql-server-error-3002/
  • /errors/sql-server-error-3013/
  • /errors/sql-server-error-3021/

Что учитывать

Точная причина зависит от версии ПО/прошивки, полного текста ошибки и контекста. Официальная инструкция имеет приоритет.

Официальный источник

Расшифровка сверена с официальными страницами поддержки из источников ниже. Редакция N1RO не диагностировала ваш конкретный случай.