Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

MSSQL_41301 1С:Предприятие и СУБД

MSSQL Error 41301: Dependency on aborted transaction in In-Memory OLTP — Решение

Обновлено: 25.08.2026 · Официальная документация ↗
  • Сообщение об ошибке: Error: 41301, Severity: 16, State: 1. A previous transaction on which the current transaction took a dependency committed aborted.
  • Откат (Rollback) пользовательских транзакций 1С при работе с оптимизированными для памяти таблицами (Memory-Optimized Tables).
  • Сбой высоконагруженных очередей, интеграционных буферов или кэш-таблиц 1С на Hekaton.

1. Архитектура конфликтов зависимостей в In-Memory OLTP

In-Memory OLTP (Hekaton) использует оптимистичный контроль параллелизма без блокировок. Если транзакция T2 читает строку, измененную транзакцией T1, а транзакция T1 впоследствии прерывается (Rollback), транзакция T2 не может быть зафиксирована и принудительно завершается с ошибкой 41301.

2. Анализ сбоев транзакций XTP через DMV

-- Статистика прерванных и конфликтных транзакций In-Memory OLTP
SELECT 
    object_name,
    counter_name,
    cntr_value
FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%In-Memory OLTP%' 
  AND counter_name LIKE '%Abort%';

3. Внедрение логики повторных попыток (Retry Logic) в коде 1С/T-SQL

Оптимистичная модель Hekaton требует обязательной обработки ошибок валидации на клиенте:

-- Шаблон T-SQL процедуры с блоком повтора транзакции (Retry Pattern)
DECLARE @RetryCount INT = 0;
DECLARE @MaxRetries INT = 5;
DECLARE @Success BIT = 0;

WHILE (@RetryCount < @MaxRetries AND @Success = 0)
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION;
        
        -- Операции с Memory-Optimized таблицей
        EXEC usp_Process1CQueue_InMemory;
        
        COMMIT TRANSACTION;
        SET @Success = 1;
    END TRY
    BEGIN CATCH
        IF ERROR_NUMBER() IN (41301, 41302, 41305, 41325)
        BEGIN
            IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
            SET @RetryCount = @RetryCount + 1;
            WAITFOR DELAY '00:00:00.050'; -- Задержка 50 мс перед повтором
        END
        ELSE
        BEGIN
            IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
            THROW;
        END
    END CATCH
END;

4. Понижение уровня изоляции до SNAPSHOT

Используйте уровень изоляции SNAPSHOT вместо REPEATABLE READ или SERIALIZABLE при обращении к memory-optimized таблицам.

💡 Практика специалистов: Любой прикладной код, работающий с Memory-Optimized таблицами SQL Server в контуре 1С, обязан содержать внешний цикл перехвата (Retry Loop) для кодов 41301, 41302 и 41305.

Частые вопросы (FAQ)

Почему Hekaton допускает чтение данных незафиксированной транзакции?

Для максимальной производительности движок In-Memory OLTP разрешает чтение версий строк до их фиксации (Read-Committed Dependency). Если исходная транзакция падает, зависимая транзакция также должна быть отменена.

Использует ли стандартная конфигурация 1С таблицы Memory-Optimized?

Платформа 1С напрямую не создает memory-optimized таблицы. Однако Hekaton часто внедряется архитекторами 1С на уровне СУБД для очередей интеграции, сервисов нумерации и кэшей.

Как избежать ошибки 41301 без изменения кода?

Сокращайте длительность транзакций, удерживайте минимальное количество строк под транзакцией и используйте уровень изоляции SNAPSHOT.

Влияет ли параметр MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT на эту ошибку?

Да, включение опции ALTER DATABASE [1C_DB] SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT = ON автоматически переводит обращения с уровнем READ COMMITTED в SNAPSHOT, снижая число зависимостей.

Полезные материалы
Рекомендуем