Взаимоблокировки

Petro Bazeliuk —  Июнь 5, 2017 — Оставьте комментарий

Хочу рассмотреть вопросы и подготовку к сертификации. Учить правильные ответы плохой путь, а вот понимать ответы и применять их, вы тем самым становитесь на путь к уровню «1С:Эксперт». По сути это цикл записей с расширенными ответами на несколько вопросов из тестов.

Для исправления взаимоблокировки вида «захват ресурсов в разном порядке», когда она возникает на исключительных блокировках СУБД, необходимо найти второй ресурс и вторую транзакцию и изменить порядок захвата ресурсов.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 62-65.


При борьбе с взаимоблокировками и необходимости перевода базы в управляемый режим управления блокировками правильная последовательность действий:
• перевести базу в управляемый режим управления блокировками;
• заниматься избавлением от взаимоблокировок.


Взаимоблокировка (deadlock) — ситуация, когда две или более транзакции ждут друг друга из-за того, что каждая из сторон блокирует ресурс, необходимый другой стороне.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 61.


Т1: S(P1) -> X(P1), T2: S(P1) -> X(P1), схема представляет собой схему взаимоблокировки с повышением уровня блокировки ресурса.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 63-65.


Типичные причины взаимоблокировок:
• захват ресурсов в разном порядке;
• повышение уровня блокировки в рамках одной транзакции;
• неоптимальная работа запроса.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 61-65.


Свойство БлокироватьДляИзменения нужно использовать для предотвращения взаимоблокировки при контроле остатков в управляемом режиме блокировок.
Источники:
• ИТС: Блокирующее чтение остатков в начале транзакции
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 72-73.


T1: X(P1) -> S(P1+P2), T2: X(P2) -> S(P1+P2),
Т1: X(P1) -> X(P2), T2: X(P2) -> X(P1), схемы представляет собой схему взаимоблокировки с установкой блокировок в различном порядке.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 62-63.


Взаимоблокировка не может произойти.
Эскалации бывают на СУБД и в менеджере управляемых блокировок. Их поведение различно. Различие состоит в том, что если в момент попытки эскалации на СУБД MS SQL кто-то другой будет держать блокировку, то эскалации не произойдет, но при этом транзакция дальше продолжит свое выполнение. Если в «1С:Предприятие» кто-то другой будет держать блокировку, то «эскалирующаяся» транзакция попадет в ожидание от всех, кто еще держит блокировки на этом ресурсе. Если в «1С:Предприятие» не получится проэскалироваться в течение N (по умолчанию 20) секунд, то транзакция получит таймаут.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 66-67.


Данная блокировка соответствует захвату ресурсов в разном порядке.


Возникнет взаимоблокировка на уровне СУБД «захват ресурсов в разном порядке».
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 61-65.


Необходимо установить явную управляемую исключительную блокировку перед записью движений в базу. Это позволит организовать очередь.
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 55-57.


Таймаут (timeout) — время, которое транзакция может ждать освобождения ресурса, задается в свойствах системы. В системе на платформе «1С:Предприятие 8» оно по умолчанию равно 20 секундам и устанавливается в конфигураторе. Это время действует и на управляемые блокировки «1С:Предприятие 8», и на блокировки СУБД. Если транзакции приходится ждать дольше, возникает таймаут.
Взаимоблокировка возникает, когда две или более транзакции ждут друг друга из-за того, что каждая из сторон блокирует ресурс, необходимый другой стороне. «Жертва» получает сообщение об ошибке мгновенно или через 100мс — 5с.
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 59-65.


Взаимоблокировка на управляемых блокировках расследуется с помощью событий:
TLOCK
— управление транзакционными блокировками в управляемом режиме.
TDEADLOCK — обнаружена взаимоблокировка в управляемом режиме.
Источники:
• ИТС: Описание и расположение служебных файлов


Для устранения взаимоблокировок нужно придерживаться следующих правил:

  • осуществлять запись ресурсов в одинаковом порядке;
  • избегать чтения ресурса после его записи, если включен режим разделения итогов; либо, если этого нельзя избежать, на время записи устанавливать свойство «БлокироватьДляИзменения» в Истину;
  • в режиме автоматического управления блокировками в запросах включать опцию ДЛЯ ИЗМЕНЕНИЯ на те ресурсы, которые будут потом записаны;
  • если есть необходимость поставить управляемую блокировку перед чтением данных ресурса, в который потом будет идти запись, нужно ставить не разделяемую блокировку, а исключительную;
  • правильная организация рабочего процесса (снижение конкуренции за одни и те же данные организационными мероприятиями);
  • выбор более подходящего прикладного объекта метаданных конфигурации для хранения данных;
  • правильная организация работы ресурсов, в которые возможна только последовательная запись;
  • оптимизация запросов, ликвидация избыточных блокировок, и уменьшение времени выполнения самих этих запросов;
  • отказ от использования механизмов, провоцирующих неоптимальную роботу запросов: это механизм разделения доступа на уровне записей при работе пользователя с ограниченными правами, и механизм разделения данных при работе пользователя с незаданным общим реквизитом, если указано использование разделяемых данных «Независимо и совместимо»;
  • снижения уровня изоляции транзакции (переход с режима автоматического управления блокировками на управляемый); это, с одной стороны, уменьшит блокирование избыточных данных, а с другой стороны, уменьшит время блокировки части ресурсов, так как все разделяемые блокировки будут сняты после выполнения запроса;
  • отказ от включения в транзакцию механизмов, вызывающих непрогнозируемое увеличение ее времени и ставящих ее в зависимость от посторонних ресурсов;
  • отказ от ошибочного рекурсивного вызова ЭтотОбъект.Записать() из транзакции записи этого же объекта;
  • снижение времени транзакции, как за счет оптимизации работы кода, так и за счет объединения нескольких транзакций в одну;
  • повышение производительности оборудования позволяет снизить вероятность взаимоблокировок.

Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 64-65.


В информации о событии TDEADLOCK в явном виде указано, кто кого ждет (DeadlockConnectionIntersections=’7 6)
Источники:
• книга «Настольная книга 1С:Эксперта по технологическим вопросам», издание 2, с. 264.


Наличие буквы «I» в графе взаимоблокировки SQL Server говорит о том, что взаимоблокировка была распознана на уровне блокировок намерений.


В данном случае управляемой взаимоблокировки не будет, но будет взаимоблокировка на уровне СУБД.


Расследование взаимоблокировок в СУБД MS SQL Server можно проводить с помощью таких инструментов:

  • SQL Server Profiler;
  • Центр управления производительностью (ЦУП).

Правильный порядок событий в технологическом журнале при возникновении взаимоблокировки на управляемых блокировках:
TLOCK-1 участника 1 ...(возможно, другие TLOCK)...
TLOCK-1 участника 2 ...(возможно, другие TLOCK)...
TDEADLOCK TLOCK-2 участника 1 TLOCK-2 участника 2


В данном случае взаимоблокировки не будет.

Petro Bazeliuk

Записи

Опыт работы с «1С:Предприятие 8» — более 10 лет, за это время реализовано 30 успешных проектов по итеративным методологиям Scrum и Kanban. Оптимальные решения для высоконагруженных ИБ с онлайном от 400 человек. Занимаюсь продвижением в массы системы контроля версий — git и методики git-flow, TDD, BDD, а также проработкой паттерна минимальной модификации конфигурации и внесением изменений без обновления базы данных. Время от времени участвую в проекте xUnitFor1C.

Комментариев нет

Be the first to start the conversation!

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

w

Connecting to %s