Взаимные блокировки в 1с как бороться
Перейти к содержимому

Взаимные блокировки в 1с как бороться

  • автор:

v8: Взаимные блокировки (deadlock)

Если Авторезервирование Тогда
ЗапросСвободныйОстаток.Текст =
«ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.Номенклатура,
| ОстаткиТоваровКомпанииОстатки.ХарактеристикаНоменклатуры,
| ОстаткиТоваровКомпанииОстатки.СкладКомпании КАК Размещение,
| ОстаткиТоваровКомпанииОстатки.СкладКомпании.Розничный КАК СкладКомпанииРозничный,
| ОстаткиТоваровКомпанииОстатки.ЦенаВРознице,
| NULL КАК ТоварТара,
| NULL КАК ДоговорВзаиморасчетов,
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Количество,
| 1 КАК СортировкаРазмещение,
| ВЫБОР
| КОГДА ОстаткиТоваровКомпанииОстатки.СкладКомпании = &ПредпочтительноеРазмещение ТОГДА
| 0
| ИНАЧЕ
| 1
| КОНЕЦ КАК СортировкаСкладКомпании,
| NULL КАК ДатаПоступления
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(,
| Заказ = &ПустойЗаказПокупателя
| И Номенклатура В (&МассивНоменклатуры)) КАК ОстаткиТоваровКомпанииОстатки
|ГДЕ
//sss работаем только с складом документа
//| НЕ ОстаткиТоваровКомпанииОстатки.СкладКомпании.Розничный
//| ИЛИ ОстаткиТоваровКомпанииОстатки.СкладКомпании = &ПредпочтительноеРазмещение»;
//vvv 03.10.2006г.
//Было
| ОстаткиТоваровКомпанииОстатки.СкладКомпании = &ПредпочтительноеРазмещение
//Стало
|
|ДЛЯ ИЗМЕНЕНИЯ //против блокировок (deadlocked)
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки «;
//vvv 03.10.2006г.

КонецЕсли;
Если Авторезервирование И Авторазмещение Тогда
ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст +
»
|ОБЪЕДИНИТЬ ВСЕ
|»;
КонецЕсли;
Если Авторазмещение Тогда
ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст +
«ВЫБРАТЬ
| ЗаказыПоставщикамОстатки.Номенклатура,
| ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры,
| ЗаказыПоставщикамОстатки.ЗаказПоставщику КАК Размещение,
| Ложь КАК СкладКомпанииРозничный,
| 0 КАК ЦенаВРознице,
| ЗаказыПоставщикамОстатки.ТоварТара,
| ЗаказыПоставщикамОстатки.ДоговорВзаиморасчетов,
| ЗаказыПоставщикамОстатки.КоличествоОстаток КАК Количество,
| 0 КАК СортировкаРазмещение,
| 1 КАК СортировкаСкладКомпании,
| ЗаказыПоставщикамОстатки.ЗаказПоставщику.ДатаПоступления КАК ДатаПоступления
|ИЗ
| РегистрНакопления.ЗаказыПоставщикам.Остатки(,
| ЗаказПокупателя = &ПустойЗаказПокупателя
| И ЗаказПоставщику.ДатаПоступления <= &ДатаОтгрузки
//vvv 03.10.2006г.
//Было
//| И Номенклатура В (&МассивНоменклатуры)) КАК ЗаказыПоставщикамОстатки «;
//Стало
| И Номенклатура В (&МассивНоменклатуры)) КАК ЗаказыПоставщикамОстатки
|
|ДЛЯ ИЗМЕНЕНИЯ //против блокировок (deadlocked)
| РегистрНакопления.ЗаказыПоставщикам.Остатки «;
//vvv 03.10.2006г.
КонецЕсли;
Если Авторезервирование И Авторазмещение Тогда
ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст + »
|УПОРЯДОЧИТЬ ПО // Определяет стратегию авторезервирования и авторазмещения
| СортировкаРазмещение, // Сначала на складе, потом в заказах
| СортировкаСкладКомпании, // Сначала предпочтительный склад, затем остальные
| ДатаПоступления УБЫВ // В порядке убывания даты отгрузки «;
ИначеЕсли Авторезервирование Тогда
ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст + »
|УПОРЯДОЧИТЬ ПО // Определяет стратегию авторезервирования и авторазмещения
| СортировкаСкладКомпании // Сначала предпочтительный склад, затем остальные «;
ИначеЕсли Авторазмещение Тогда
ЗапросСвободныйОстаток.Текст = ЗапросСвободныйОстаток.Текст + »
|УПОРЯДОЧИТЬ ПО // Определяет стратегию авторезервирования и авторазмещения
| ДатаПоступления УБЫВ // В порядке убывания даты отгрузки «;
КонецЕсли;

ВЫБРАТЬ
ОстаткиТоваровКомпанииОстатки.Номенклатура,
ОстаткиТоваровКомпанииОстатки.ХарактеристикаНоменклатуры,
ОстаткиТоваровКомпанииОстатки.СкладКомпании КАК Размещение,
ОстаткиТоваровКомпанииОстатки.СкладКомпании.Розничный КАК СкладКомпанииРозничный,
ОстаткиТоваровКомпанииОстатки.ЦенаВРознице,
NULL КАК ТоварТара,
NULL КАК ДоговорВзаиморасчетов,
ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Количество,
1 КАК СортировкаРазмещение,
ВЫБОР
КОГДА ОстаткиТоваровКомпанииОстатки.СкладКомпании = &ПредпочтительноеРазмещение ТОГДА
0
ИНАЧЕ
1
КОНЕЦ КАК СортировкаСкладКомпании,
NULL КАК ДатаПоступления
ИЗ
РегистрНакопления.ОстаткиТоваровКомпании.Остатки(,
Заказ = &ПустойЗаказПокупателя
И Номенклатура В (&МассивНоменклатуры)) КАК ОстаткиТоваровКомпанииОстатки
ГДЕ
ОстаткиТоваровКомпанииОстатки.СкладКомпании = &ПредпочтительноеРазмещение

ДЛЯ ИЗМЕНЕНИЯ //против блокировок (deadlocked)
РегистрНакопления.ОстаткиТоваровКомпании.Остатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗаказыПоставщикамОстатки.Номенклатура,
ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры,
ЗаказыПоставщикамОстатки.ЗаказПоставщику КАК Размещение,
Ложь КАК СкладКомпанииРозничный,
0 КАК ЦенаВРознице,
ЗаказыПоставщикамОстатки.ТоварТара,
ЗаказыПоставщикамОстатки.ДоговорВзаиморасчетов,
ЗаказыПоставщикамОстатки.КоличествоОстаток КАК Количество,
0 КАК СортировкаРазмещение,
1 КАК СортировкаСкладКомпании,
ЗаказыПоставщикамОстатки.ЗаказПоставщику.ДатаПоступления КАК ДатаПоступления
ИЗ
РегистрНакопления.ЗаказыПоставщикам.Остатки(,
ЗаказПокупателя = &ПустойЗаказПокупателя
И ЗаказПоставщику.ДатаПоступления <= &ДатаОтгрузки
И Номенклатура В (&МассивНоменклатуры)) КАК ЗаказыПоставщикамОстатки

ДЛЯ ИЗМЕНЕНИЯ //против блокировок (deadlocked)
РегистрНакопления.ЗаказыПоставщикам.Остатки
УПОРЯДОЧИТЬ ПО // Определяет стратегию авторезервирования и авторазмещения
СортировкаРазмещение, // Сначала на складе, потом в заказах
СортировкаСкладКомпании, // Сначала предпочтительный склад, затем остальные
ДатаПоступления УБЫВ // В порядке убывания даты отгрузки

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

«1С:Эксперт» - цикл статей

Хочу рассмотреть вопросы и подготовку к сертификации. Учить правильные ответы плохой путь, а вот понимать ответы и применять их, вы тем самым становитесь на путь к уровню «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

Конфликт блокировок при выполнении транзакции в 1С 8.3 и 8.2

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

конфликт

Причины и способы решения проблемы

Большое количество выполняемых операций

Первым делом при поиске причин следует уточнить, сколько же одновременно работающих пользователей находится в той информационной базе, в которой выдается подобная ошибка. Как мы знаем, максимальное их количество может быть довольно большим. Это и тысяча, и пять тысяч.

Механизм блокировок и транзакций описан в руководстве разработчика. Их используют при обращении нескольких сеансов к одним и тем же данным одновременно. Логично, что одни и те же данные не могут изменяться разными пользователями в один и тот же момент.

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

Регламентные задания

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

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

«Зависшие сеансы»

Проблема «зависших сеансов» пользователей знакома практически каждому, кто сталкивался с обслуживанием 1С. Пользователь мог уже давно выйти из программы, или закрыть какой-либо документ, но его сеанс по-прежнему остается в системе. Проблема чаще всего единичная и достаточно завершить подобный сеанс через консоль администратора. Такие же проблемы могут возникнуть и с фоновыми заданиями.

По многочисленным комментариям на просторах интернета подобные ситуации чаще встречаются при использовании сетевых ключей защиты. Если ситуация с «зависающими сеансами» повторяется систематически, это причина произвести тщательную проверку и обслуживание системы и серверов (если база клиент-серверная).

Ошибки при написании конфигурации

Все типовые конфигурации разработаны квалифицированными специалистами и экспертами. Каждая система тщательно тестируется и оптимизируется для более быстрой и корректной работы в ней.

Получите понятные самоучители по 1С бесплатно:

В связи с этим причина ошибки может крыться в неоптимальном коде, написанном сторонним разработчиком. Это может быть «тяжелый» запрос, который будет блокировать данные на длительный промежуток времени. Так же нередки случаи построения алгоритмов с низкой производительностью и нарушением логики.

Большая вероятность, что конфликт блокировки возник именно из-за ошибок разработчика, если он возник после обновления программы. Для проверки можно просто «откатить» доработки, либо произвести рефакторинг кода.

1С Транзакция вызвала взаимоблокировку ресурсов

Как понимаю проблема в том, что если нет кластерного индекса — идет блокировка большей части таблицы или всей таблицы. Если есть кластерный индекс — идет блокировка записей индекса. И конфликта блокировок не возникает. Большую роль еще играет упорядоченность данных, т.к. не происходит хаотичной блокировки таблицы. Ну и очень важно выгружать данные в каждой отдельной транзакции так чтобы в запросе был только набор уникальных измерений.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *