Взаємоблокування 1С та способи їх усунення

Взаємоблокування в 1С - це нерозв'язний конфлікт двох блокувань даних. Конфлікт полягає у взаємному очікуванні двох та більше користувачів на блокуванні даних.

У системі іноді з'являється повідомлення "Транзакція викликала взаємоблокування ресурсів", що сигналізує фахівця про наявність помилок у системі.

Нижче ми розглянемо докладніше, що таке взаємоблокування і як їх уникнути.

способи

Для вирішення цієї проблеми взаємоблокувань «менеджер взаємоблокувань» знаходить спірні ситуації та відкочує найменш важливу для СУБД транзакцію (на його думку).

Виникнення таких виняткових ситуацій можна відстежити Центру управління продуктивністю (ЦУП). У будь-якій системі необхідне зведення таких ситуацій нанівець.

Типові причини взаємоблокування СУБД в 1С 8.3

Встановлення недостатнього рівня блокування ресурсу

Одна із найпоширеніших причин взаємоблокувань. Полягає в тому, що дві і більше транзакції зчитують дані в режимі блокування (S), що розділяється, а потім намагаються змінити ці дані. Але якщо на ресурс накладено S-блокування в іншій транзакції, природно, у всіх транзакціях нічого не вийде, що призводить до взаємоблокувань.

Рішенням є встановлення максимально необхідного рівня ізоляції.

Дляавтоматичного режиму :

Захоплення ресурсів 1С у різному порядку

Виникнення цього типу взаємоблокування можливе при блокуванні кількох різних ресурсів різними транзакціями у різній послідовності.

способи

Причиною взаємоблокування 1С може бути різний порядок захоплення ресурсів.

Приклад: маємо 2 документи, Надходження ТМЦ та Реалізація ТМЦ. Припустимо, документи роблять рухи по двох регістрах.«Залишки на складах», «Залишки організацій». В обробці проведення присутні наступні рядки:

Тобто. ресурси блокуються у вигляді у різному порядку. Якщо дві транзакції збігатимуться за часом, вийде, що жоден із документів не зможе виконати другу дію — ресурси будуть заблоковані, що призведе до взаємоблокування.

Рішення – блокування ресурсів в одному порядку. У разі, якщо зробити це дуже трудомістко, є сенс встановити блокування в потрібному порядку в коді процедури явним способом.

Помилка блокувань 1С під час роботи внутрішніх механізмів СУБД

Розпаралелювання процесів

Дуже часто адміністратори зустрічаються з помилкою «розпаралелювання» процесів. СУБД своєму рівні може розподілити виконання на різні процесори системи. У цьому випадку процеси на різних процесорах можуть заблокувати ресурси і цим викликати взаємоблокування. Типовими для цієї проблеми є такі помилки:

  • Intra-query parallelism caused your server command to deadlock
  • Transaction був розблокований на thread communication buffer resources with another process and has been chosen as the deadlock victim

Вирішується дана проблема встановленням параметраmax degree of parallelism СУБД значення «1» (за замовчуванням там «0»).

Побудова плану запиту з надмірними блокуваннями

Також взаємоблокування в 1С можуть виникнути з вини СУБД через:

При побудові складного запиту СУБД може побудувати не оптимальний план запиту і заблокувати «зайві» ресурси, що, своєю чергою, може призвести до взаємоблокування.

Зазвичай це відбувається за таких умов:

  • виконується сканування (table scan, index scan);
  • наявність конструкції «ДЛЯ ЗМІНИ»;
  • увімкнено автоматичний режим блокування.

Для вирішення цих проблем, відповідно, необхідно:

  • оптимізувати запит 1С, щоб виключити сканування таблиць;
  • не зловживати конструкцією «ДЛЯ ЗМІНИ»;
  • переведення конфігурації в керований режим блокування.

Неоптимальні запити

І останньою типовою причиною виникнення блокування є неоптимальні запити, які можуть викликати надмірні блокування і, як наслідок, взаємоблокування.