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

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

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

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

MSSQL Error 41302: The current transaction attempted to update a record updated — Решение

Обновлено: 25.08.2026 · Официальная документация ↗
  • Ошибка в приложении: Error: 41302, Severity: 16, State: 1. The current transaction attempted to update a record that has been updated since this transaction started.
  • Сбои при конкурентном изменении одних и тех же записей в memory-optimized таблицах.
  • Массовый откат транзакций при параллельной обработке очередей или остатков.

1. Причина возникновения конфликта Write-Write Conflict

В неблокирующем движке In-Memory OLTP первая транзакция, изменившая строку, блокирует возможность ее обновления другими параллельными транзакциями до своего завершения. Любая вторая транзакция, пытающаяся обновить ту же строку, немедленно завершается с ошибкой 41302.

2. Анализ коллизий в хеш-индексах (Hash Bucket Collisions)

Если размер бакетов хеш-индекса (BUCKET_COUNT) выбран неправильно, разные ключи строк попадают в один бакет, увеличивая вероятность ложных конфликтов:

-- Проверка распределения строк по бакетам хеш-индексов
SELECT 
    OBJECT_NAME(i.object_id) AS table_name,
    i.name AS index_name,
    h.total_bucket_count,
    h.empty_bucket_count,
    (h.empty_bucket_count * 100.0 / h.total_bucket_count) AS empty_bucket_percent,
    h.avg_chain_length,
    h.max_chain_length
FROM sys.dm_db_xtp_hash_index_stats h
JOIN sys.indexes i ON h.object_id = i.object_id AND h.index_id = i.index_id;

3. Оптимизация BUCKET_COUNT для исключения коллизий

-- Перестройка индекса с увеличением BUCKET_COUNT (от 1.5x до 2x от числа уникальных ключей)
ALTER TABLE [dbo].[Queue_1C] 
ALTER INDEX [IX_Queue_1C_Hash] 
REBUILD WITH (BUCKET_COUNT = 1048576);

4. Партиционирование очередей для снижения конкуренции

Разделяйте горячие строки (например, регистры остатков или очереди сообщений) по виртуальным шардам/потокам (ThreadID) с использованием вычисляемых колонок или детерминированного хеширования.

💡 Практика специалистов: Если средняя длина цепочки (avg_chain_length) в dm_db_xtp_hash_index_stats превышает 2–3, немедленно увеличивайте BUCKET_COUNT, иначе производительность Hekaton деградирует до уровня сканирования всей таблицы.

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

Можно ли заставить Hekaton ожидать освобождения строки (как обычный LCK_M_X)?

Нет, архитектура In-Memory OLTP спроектирована как Lock-Free (без блокировок) и Latch-Free. Ожидание заблокированных строк не поддерживается, система сразу генерирует ошибку 41302.

Какой уровень BUCKET_COUNT считается нормальным?

Значение BUCKET_COUNT должно быть степенью двойки и составлять от 1 до 2 раз больше максимального ожидаемого количества уникальных значений индексного ключа.

Что делать при регулярном возникновении 41302 в процедурах 1С?

Внедрите в код 1С алгоритм оптимистичной повторной попытки (Retry Loop) с экспоненциальной задержкой (Exponential Backoff).

Влияет ли использование некластеризованных B-Tree (Range) индексов на эту ошибку?

Замена HASH-индекса на NONCLUSTERED B-Tree снижает коллизии при диапазонных выборках, но при попытке модификации одной строки двумя транзакциями ошибка 41302 сохранится.

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