gifts2017

Просмотр заблокированных строк в 1С

Опубликовал Андрей Бурмистров (Andreynikus) в раздел Администрирование - Оптимизация БД (HighLoad)

Ввиду своей деятельности, мне часто приходится рассказывать про различные аспекты оптимизации и в том числе про блокировки. Очень часто слушатели задают следующие вопросы: Как посмотреть в реальном времени, какие именно данные сейчас заблокированы? Как понять, что сейчас заблокировано в терминах 1С? Если гранулярность блокировки страница, как увидеть, какие данные в ней находятся? Раньше приходилось отвечать, что инструмента, который показывает все вышеописанное, сейчас просто нет. Но потом мне это надоело, и я решил сделать собственный инструмент, который позволяет ответить на все вышеописанные вопросы.

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

Инструмент не является конкурентом для ЦУП или облачного сервиса анализа блокировок, он предназначен в первую очередь для обучения и ознакомления с работой блокировок, а не для анализа ожиданий на блокировках.

Все инструменты на текущий момент показывают только информацию постфактум, когда ожидание уже случилось. Данный инструмент показывает ситуацию на текущий момент.

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

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

Сразу скажу что обработка работает не быстро, но такая цель и не ставилась. При этом следует учитывать, что работа возможна только с СУБД MS SQL Server и только в управляемом приложении.

Если ожидание идет на сервере СУБД, тогда можно увидеть, на каком именно ресурсе идет ожидание, в колонке статус будет значение «Ожидание». Для блокировок 1С посмотреть, на чем идет ожидание, не получится, т.к. сервер 1С просто не пишет эту информацию в логи в момент ожидания, она туда попадает только после того, как ожидание завершится.

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

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

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

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

Для отображения данных необходимо нажать «Обновить».

В данном случае видно, что администратором наложены как блокировки СУБД, так и блокировки 1С (выделены жирным). 

Если блокировка СУБД наложена на кластерный индекс, тогда можно посмотреть, какие именно записи заблокированы, сделав двойной клик. При этом в таблице ниже будут отображены все заблокированные записи в терминах 1С. Например, здесь видно, что в таблице итогов регистра ТоварныеЗапасы заблокирована одна строка с итогом за октябрь и одна строка с текущими итогами.

Если блокировка СУБД наложена на некластреный индекс, тогда, к сожалению, заблокированные записи посмотреть не получится.

Если это блокировка 1С, тогда независимо от пространства блокировок можно будет всегда посмотреть, что именно заблокировано.

При желании можно включить отображение служебных блокировок СУБД (флаг «Отображать блокировки намерения и стабильности схемы»). Мне сложно представить, кому и зачем на практике может понадобиться этот флаг, разве что таким же маньякам, как я :)

Хотя, возможно, кто-то будет к 1С:Эксперт готовиться и захочет «потрогать руками» служебные блокировки СУБД, а то про них говорят и спрашивают, но никто не показывает.

На данном рисунке ясно видно блокировку намерения на страницу и таблицу.

Если в момент нажатия кнопки Обновить в базе было ожидание на блокировке, то это будет отображено в верхней таблице.

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

Если вы используете управляемый режим блокировок, то не удивляйтесь, что на уровне СУБД обработка почти всегда будет показывать только X блокировки. Просто S блокировки будут сниматься сразу после чтения, не дожидаясь конца транзакции, поэтому верятность их поймать крайне низка. 

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

Надеюсь, что данная обработка поможет вам лучше понять работу блокировок на практике и сподвигнет на самостоятельные эксперименты в этой области. Особенно это будет полезно при подготовке к экзамену 1С:Эксперт.

Скачать файлы

Наименование Файл Версия Размер
Текущие блокировки MS SQL Server и 1С 68
.epf 246,97Kb
25.10.16
68
.epf 246,97Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. WellMaster (WellMaster) 26.10.16 09:59
Просто пытаюсь открыть обработку:

{ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(1033,12)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуДанныхПоСтрокеSQL)
			Возврат <<?>>ПолучитьТаблицуДанныхПоСтрокеSQL(СтруктураПараметров);
{ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(1035,12)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуДанныхПоСтраницеSQL)
			Возврат <<?>>ПолучитьТаблицуДанныхПоСтраницеSQL(СтруктураПараметров);
{ВнешняяОбработка.Блокировки_MS_SQL_Server_1С.МодульОбъекта(1603,17)}: Процедура или функция с указанным именем не определена (ПолучитьТаблицуЛоговТЖ)
	ТаблицаЛогов = <<?>>ПолучитьТаблицуЛоговТЖ();
...Показать Скрыть
2. DenisCh Гейтс (DenisCh) 26.10.16 10:08
Обратись к автору обработки
3. Андрей Бурмистров (Andreynikus) 26.10.16 10:42
(1) WellMaster, обработка написана только под управляемое приложение. При запуске в обычном приложении будет описанная вами ошибка.
4. Sergey Andreev (starik-2005) 27.10.16 13:38
Как я понял, обработка показывает текущие блокировки СУБД (MS SQL) и уже завершившиеся блокировки 1С? Для первого, в принципе, можно в менеджмент студио правой кнопкой на базе и в отчетах найти соответствующий отчет по блокировкам. Я так понимаю, что основной плюс - это получение имени объекта в 1С?
5. Андрей Бурмистров (Andreynikus) 27.10.16 22:01
(4) starik-2005,
> Как я понял, обработка показывает текущие блокировки СУБД (MS SQL)
Да, именно так.

> уже завершившиеся блокировки 1С
Нет, показываются установленные но не завершившиеся блокировки 1С

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

Если имеется ввиду отчет «Все блокирующие транзакции» то это не так. В отчете вы увидите только то, что одна транзакция блокирует другую. На какие строки наложена блокировка там не указано, на какой ресурс тоже не указано, даже тип блокировки не указан. На практике этот отчет почти бесполезен.
tormozit; +1 Ответить
6. Женька Ture (ture) 01.12.16 16:46
(0) 1С держит все блокировки на сервере СУБД?
Заблокировать() и если пользователь форму открывает и начинает редактировать туда же?
7. Женька Ture (ture) 02.12.16 08:59
Выбор эксперта на инфостарте стал не объективным.
8. Андрей Бурмистров (Andreynikus) 04.12.16 14:27
(6)
Нет конечно, блокировки 1С находятся на сервере приложений, именно их обработка и показывает если включить флаг.
9. Андрей Бурмистров (Andreynikus) 04.12.16 14:30
(6)
Блокировки 1С на сервере приложений, блокировки СУБД на сервере СУБД. Обработка может показывать и то и другое.
10. Андрей Бурмистров (Andreynikus) 04.12.16 14:33
(7)
Напишите поподробнее, что вы имеете ввиду?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа