Top.Mail.Ru
Заказать консультацию
специалиста 1С
Отправить заявку

ИнфоСофт использует файлы «cookie» с целью персонализации сервисов и повышения удобства пользования веб-сайтом. Вы можете запретить обработку сookies в настройках браузера. Пожалуйста, ознакомьтесь с политикой использования cookies.
Оставаясь на сайте, вы соглашаетесь с политикой использования cookies.

Ошибки блокировок 1С и как с ними бороться

Сковородина Алина Посмотреть все статьи >> Эксперт по технологическим вопросам франчайзинговой сети "ИнфоСофт".
30.07.2024
2221
Время прочтения - 9 мин.
Заказать консультацию

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

Ошибки блокировок возникают при превышении времени ожидания блокировки (таймаут) или при неразрешимом конфликте блокировок (взаимоблокировка). На сервере 1C выделяются два типа ошибок, связанных с блокировкой данных:

1.png

Первый тип ошибок

 

2.png

Второй тип ошибок

 

Первый тип ошибки – ожидания на управляемых блокировках. Таймаут блокировки возникает, когда один пользователь удерживает блокировку на определенном наборе записей, не освобождая ее в течение определенного периода времени. Это может привести к тому, что другие пользователи не смогут получить доступ к этому набору и получат ошибку. Время ожидания блокировки данных устанавливается в конфигураторе в разделе «Администрирование – Параметры информационной базы». Также с версии платформы 8.3.20 данная возможность реализована в пользовательском режиме в разделе «Функции для технического специалиста – Параметры информационной базы».

3.png


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

Основной инструмент расследования причин возникновения таймаутов – технологический журнал (logcfg.xml). Для расследования потребуется настроить технологический журнал вида:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="c:\tj\TLOCK" history="3">
        <event>
            <eq property="name" value="TLOCK"/>
        </event>
        <event>
            <eq property="name" value="TTIMEOUT"/>
        </event>
        <event>
            <eq property="name" value="TDEADLOCK"/>
        </event>
<event>
            <eq property="name" value="DBMSSQL"/>
        </event>
        <event>
             <eq property="Name" value="SDBL"/>
             <eq property="Func" value="BeginTransaction"/>
         </event>
         <event>
             <eq property="Name" value="SDBL" />
             <eq property="Func" value="RollbackTransaction"/>
         </event>
         <event>
             <eq property="Name" value="SDBL" />
             <eq property="Func" value="CommitTransaction"/>
         </event>
<property name="all"/>
</log>
</config>

Обратите внимание, объем собранного файла может быть значительным из-за отсутствия ограничения на время сбора событий в журнале. Настройка приведена для OC Windows.

При возникновении таймаута в системе в технологическом журнале появится запись:

12:06.351000-0, TTIMEOUT, 5, process=rphost, p:processName=erp, OSThread=9008, t:clientID=2426, t:applicationName=BackgroundJob, t:computerName=server1c, t:connectID=22040277, SessionID=892079, Usr=Иванов Иван Иванович, DBMS=DBMSSQL, DataBase=MSSQL\erp, WaitConnections=22040017, Context=
'ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 12218 : ВыполнитьОбновлениеДоступаНаУровнеЗаписей(ОбновитьВсе, ВызыватьИсключениеВместоРегистрацииОшибки, 0);
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 12356 : ВыполнитьОбновлениеДоступа(ОбновитьВсе, ОписаниеОсновногоСеанса,ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 13058 : ЗавершитьОбновлениеДоступа(Контекст);
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 14038 : ОтключитьРегламентноеЗаданиеЕслиНетНовыхЗаданий(Контекст);
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 14125 : Блокировка.Заблокировать();'

Из этой записи следует, что на сервере server1c (t:computerName=server1c) в базе erp (p:processName=erp) у пользователя Иванов Иван Иванович (Usr=Иванов Иван Иванович) в фоновом задании (t:applicationName=BackgroundJob) при попытке выполнить блокировку данных произошел конфликт блокировок в строке (Context= …

'ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 14125 : Блокировка.Заблокировать();' )

Виновником конфликта стал пользователь с TCP–соединением номер 22040017 (WaitConnections=22040017).

Данная запись не содержит информации о конкретном наборе данных, где произошел конфликт блокировок. Более детальные сведения можно найти в событии TLOCK, представленном ниже:

12:06.351004-29996990, TLOCK, 4, process=rphost, p:processName=erp, OSThread=9008, t:clientID=2426, t:applicationName=BackgroundJob, t:computerName= server1c, t:connectID=22040277, SessionID=892079, Usr= Иванов Иван Иванович, DBMS=DBMSSQL, DataBase= MSSQL\erp, Regions='InfoRg40487.DIMS, InfoRg40498.DIMS', Locks='InfoRg40487.DIMS Exclusive Fld2562=0,InfoRg40498.DIMS Exclusive Fld2562=0',WaitConnections=22040017,connectionID=2b90e13a-cade-4d35-a366-aa6d2131d4bd,Context=
'ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 12218 : ВыполнитьОбновлениеДоступаНаУровнеЗаписей(ОбновитьВсе, ВызыватьИсключениеВместоРегистрацииОшибки, 0);
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 12356 : ВыполнитьОбновлениеДоступа(ОбновитьВсе, ОписаниеОсновногоСеанса,ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 13058 : ЗавершитьОбновлениеДоступа(Контекст);
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 14038 : ОтключитьРегламентноеЗаданиеЕслиНетНовыхЗаданий(Контекст);
ОбщийМодуль.УправлениеДоступомСлужебный.Модуль : 14125 : Блокировка.Заблокировать();'

Ключевые поля событий TLOCK и TTIMEOUT совпадают, а также имеются очень важные для нас поля – Regions и Locks. В поле Regions указываются пространства управляемых транзакционных блокировок, а в поле Locks указывается, какие именно значения попытался заблокировать пользователь в  пространстве блокировок. Эти два поля помогут выяснить, где именно произошло пересечение блокировок.

Чтобы понять, что именно делал виновник блокировки, необходимо найти событие SDBL, которое закончилось позже таймаута (TLOCK 12:06.351004 < SDBL 12:09.345007). Кроме того, значение поля t:connectID события SDBL (t:connectID=22040017) должно совпадать с значением поля WaitConnections (WaitConnections=22040017), а длительность события SDBL должна быть больше, чем длительность TLOCK (350015417 > 29996990).

12:09.345007-350015417, SDBL, 3, process=rphost, p:processName=erp, OSThread=13020, t:clientID=304, t:applicationName=1CV8C, t:computerName=pc, t:connectID=22040017,SessionID=871190,Usr=Петров Иван Петрович, AppID=1CV8C, DBMS=DBMSSQL, DataBase= MSSQL\erp, Trans=0, Func=Transaction, Func=CommitTransaction, Context=
' Форма.Записать : Документ.АктВыполненныхРабот.Форма.ФормаДокумента '

По найденному событию видим, что виновником блокировки стал пользователь Петров Иван Петрович (Usr=Петров Иван Петрович), который проводил документ «АктВыполненныхРабот» (Context=' Форма.Записать : Документ.АктВыполненныхРабот.Форма.ФормаДокумента '), и делал он это 350 секунд (350015417).

Далее необходимо выяснить причины такого долгого проведения документа. Возможно, это связано с длительным выполнением запроса в процедуре проведения. Чтобы найти такие запросы, мы добавили событие DBMSSQL в настройку технологического журнала. Эта настройка также поможет понять, бывают ли в системе длительные запросы к СУБД, оптимизация которых улучшит общую производительность системы.

Основными причинами конфликтов блокировок являются:

  1. Длительные транзакции. Это могут быть как длительные проведения документов, так и длительные обмены. В первом случае необходимо оптимизировать поведения документов, во втором случае может помочь уменьшение объема порции для обмена.

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

  3. Запись в таблицу итогов без разделителя. Разрешите разделение итогов, если блокировка происходит на регистре накопления или регистре бухгалтерии, таким образом повысится параллельность записи.

  4. Служебные обработки. Пользователи иногда в рабочее время запускают обработку удаления помеченных на удаление, либо поиск и удаление дублей. Такое нужно запрещать выполнять в рабочее время.

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

Существуют еще так называемые «законные» блокировки асинхронными фоновыми заданиями. В некоторых конфигурациях 1С пытаются заблокировать документ, который еще проводится. Таким образом проверяется, проведен документ или нет. На такие блокировки не стоит обращать внимания.

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

Исследование причин взаимоблокировок требует немного больше труда, чем выявление причин конфликта блокировок, однако это также возможно. Для анализа причин возникновения взаимоблокировок можно использовать ту же настройку технологического журнала, что и для анализа таймаутов.

При возникновении взаимоблокировки в технологическом журнале появится запись:

31:30.892049-0, TDEADLOCK, 5, process=rphost, p:processName=erp, OSThread=8136, t:clientID=3191, t:applicationName=1CV8C, t:computerName=pc2, t:connectID=22015672, SessionID=873764, Usr=КрыловАА, AppID=1CV8C, DBMS=DBMSSQL, DataBase=MSSQL\erp, DeadlockConnectionIntersections='22015672 22032238 Reference440.REFLOCK Exclusive Fld2562=0 Fld86575=519:9275783fd813577f4a0152f0abafdbad ID=440:b6529440c91de00711ef2f7a7df69702,22032238 22015672 Reference440.REFLOCK Exclusive Fld2562=0 Fld86575=519:bb9000155d039a2211ea3070294c4777 ID=440:aa04b49691d4a78d11edb8e5f5b07605',Context=

'Форма.Вызов : Обработка.СопоставлениеНоменклатурыБЭД.Форма.Форма.Модуль.СохранитьСопоставление
Обработка.СопоставлениеНоменклатурыБЭД.Форма.Форма.Форма : 1701 : СохранитьСопоставленнуюНоменклатуруКонтрагентов(Отказ);
         Обработка.СопоставлениеНоменклатурыБЭД.Форма.Форма.Форма : 2259 : СопоставлениеНоменклатурыКонтрагентов.СоздатьОбновитьНоменклатуруКонтрагента(
                   ОбщийМодуль.СопоставлениеНоменклатурыКонтрагентов.Модуль : 108 : ОбщегоНазначенияБЭД.УстановитьУправляемуюБлокировкуПоСсылке(НоменклатураКонтрагента);
                            ОбщийМодуль.ОбщегоНазначенияБЭД.Модуль : 107 : УстановитьУправляемуюБлокировку(ПространствоБлокировки, Поля,, Режим);
                                      ОбщийМодуль.ОбщегоНазначенияБЭД.Модуль : 88 : Блокировка.Заблокировать();'

Из данной записи следует, что в базе erp (p:processName=erp) у пользователя КрыловАА (Usr=КрыловАА) в тонком клиенте (t:applicationName=1CV8C) при попытке выполнить блокировку данных произошла взаимоблокировка на строке Context=…

' ОбщийМодуль.ОбщегоНазначенияБЭД.Модуль : 88 : Блокировка.Заблокировать();'.

Стоит обратить внимание на свойство (DeadlockConnectionIntersections='22015672 22032238 Reference440…), которое содержит информацию о парах транзакций, вызывающих взаимную блокировку. В данном случае взаимоблокировка произошла между пользователями с номерами TCP-соединений 22015672 и 22032238 на справочнике Reference440.

Нам известен контекст выполнения пользователя, который стал жертвой взаимоблокировки. Чтобы узнать контекст второго участника взаимоблокировки, необходимо найти событие SDBL c t:connectID равным 22032238, которое началось до возникновения блокировки (31:30.892049-0, TDEADLOCK) и закончилось после нее (31:30.954748-1609254, SDBL).

31:30.954748-1609254, SDBL, 3, process=rphost, p:processName=erp, OSThread=13020, t:clientID=304, t:applicationName=1CV8C, t:computerName=pc3, t:connectID=22032238, SessionID=871190, Usr=СергееваОВ, AppID=1CV8C, DBMS=DBMSSQL, DataBase=MSSQL\erp, Trans=0, Func=Transaction, Func=CommitTransaction, Context=
Форма.Вызов : Документ.ЭлектронныйДокументВходящийЭДО.Форма.ФормаПросмотра.Модуль.СоздатьДокументыУчета
Документ.ЭлектронныйДокументВходящийЭДО.Форма.ФормаПросмотра.Форма : 122 : ИнтеграцияЭДО.ОтразитьВУчетеЭлектронныеДокументы(ПараметрыЗаполнения, СпособОбработки);
ОбщийМодуль.ИнтеграцияЭДО.Модуль : 3261 : ЗафиксироватьТранзакцию();

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

Существует два вида взаимоблокировок:

  1. Захват объектов в разном порядке. Для устранения этого вида взаимоблокировок ресурсы в процессе транзакции должны захватываться в одинаковом порядке, например, алфавитном.

  2. Повышение уровня изоляции. Блокировка ресурса в транзакции должна сразу осуществляться с необходимым уровнем изоляции.

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


Заказать консультацию специалиста 1С
Оставьте заявку и наши эксперты проконсультируют вас по данной статье.
Отправить заявку
Рассказать друзьям
Для разработчиков 1С
Вам может быть интересно: