1
0
mirror of https://github.com/kuzyara/Lock1C-cheet-sheet.git synced 2024-11-21 10:45:49 +02:00
Lock1C-cheet-sheet/README.md

170 lines
22 KiB
Markdown
Raw Normal View History

2019-10-09 05:08:03 +02:00
# Шпаргалка по блокировкам 1С
2019-12-26 05:22:37 +02:00
2022-06-21 07:54:36 +02:00
*Задача: наложение блокировок на регистр сведений*
2019-12-26 05:22:37 +02:00
2019-10-09 05:06:45 +02:00
* в репозитории 1С (https://github.com/1CEnterprise/MSQL-for-1C)
2019-10-09 04:37:54 +02:00
* в картинках (https://infostart.ru/public/629017/)
![alt text](https://github.com/kuzyara/Locks-cheet-sheet/blob/master/Блокировки.jpg)
2019-12-26 05:40:40 +02:00
Блокировки на **НаборЗаписей.Прочитать()** в 8.2 и в 8.3 работают по-разному:
* Например, в 8.2 у вас любое чтение будет ставить S-блокировку. Причем, чтение – это не просто Запрос.Выполнить(), но и Ссылка.Реквизит, Ссылка.ПолучитьОбъект() и т.д.
* А в 8.3 без режима совместимости уже блокировок на чтение не будет. Таким образом, 8.3 безусловно выигрывает в плане параллельности работы.
* Ну а дальше начинается самое интересное – например, для конструкции НаборЗаписей.Прочитать() в управляемом режиме 8.2 у вас будет S-блокировка на сервере СУБД (это естественно). Но кроме этого также будет разделяемая блокировка на сервере 1С, причем это проявляется и в 8.2, и в 8.3. И главная проблема в том, что эта разделяемая блокировка у вас будет длиться до конца транзакции – пока транзакция не закончится, данные будут блокированы.
Поэтому рекомендация номер один – если набор записей вам нужен только для чтения, лучше использовать запрос, а не объектную модель. Тогда вы ничего блокировать не будете, а если и будете, то ненадолго.
2019-10-09 05:02:48 +02:00
Блокировки платформы:
* Р - РежимБлокировкиДанных.Разделяемый
* И - РежимБлокировкиДанных.Исключительный
Блокировки СУБД:
* Sch-S = Блокировка стабильности схемы. Гарантирует, что элемент схемы, такой как таблица или индекс, не будет удален до тех пор, пока сеанс связи удерживает блокировку стабильности схемы на данный элемент схемы;
* Sch-М = Блокировка изменения схемы. Должен поддерживаться любым сеансом связи, во время которого предполагается изменить схему данного ресурса. Гарантирует, что другие сеансы не имеют ссылок на обозначенный объект;
* S = Коллективная блокировка. Удерживающему сеансу предоставлен коллективный доступ к ресурсу;
* U = Блокировка обновления. Указывает блокировку обновления, полученную на ресурсы, которые со временем могут быть обновлены. Используется для предотвращения общей формы взаимоблокировки, которая возникает, когда множество сеансов блокируют ресурсы для потенциального обновления в последующее время;
* X = Монопольная блокировка. Удерживающему сеансу предоставлен исключительный доступ к ресурсу;
* IS = Блокировка с намерением коллективного доступа. Указывает намерение поместить S блокировки на некоторые подчиненные ресурсы в иерархии блокировок;
* IU = Блокировка с намерением обновления. Указывает намерение поместить U блокировки на некоторые подчиненные ресурсы в иерархии блокировок;
* IX = Блокировка с намерением монопольного доступа. Указывает намерение поместить X блокировки на некоторые подчиненные ресурсы в иерархии блокировок;
* SIU = Коллективная блокировка с намерением обновления. Указывает коллективный доступ к ресурсу с намерением получения блокировок обновления на подчиненные ресурсы в иерархии блокировок;
* SIX = Коллективная блокировка с намерением монопольного доступа. Указывает коллективный доступ к ресурсу с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;
* UIX = Блокировка обновления с намерением монопольного доступа. Указывает блокировку обновления ресурса с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;
* BU = Блокировка массового обновления. Используется для массовых операций;
2023-11-24 06:42:30 +02:00
![alt text](Избыточные%20блокировки.%20Подготовка%20к%20сдаче%20экзамена%201С_Эксперт%201-21%20screenshot.png)
2024-04-04 10:16:10 +02:00
### Объектная техника
--------------------------------------------------
> Теория: способы доступа к данным
>
> Система «1С:Предприятие» поддерживает два способа доступа к данным, хранящимся в базе данных:
> * объектный (для чтения и записи);
> * табличный (для чтения).
>
> __Объектный способ__ доступа к данным реализован посредством использования объектов __встроенного языка__.
> Важной особенностью объектного способа доступа к данным является то, что, обращаясь к какому-либо объекту встроенного языка, мы обращаемся к некоторой совокупности данных, находящихся в базе данных, как к единому целому.
> Например, объект ДокументОбъект.ОказаниеУслуги будет содержать значения всех реквизитов документа Оказание услуги и всех его табличных частей.
> Объектная техника обеспечивает сохранение целостности объектов, кеширование объектов, вызов соответствующих обработчиков событий и т. д.
>
> __Табличный доступ__ к данным в «1С:Предприятии» реализован с помощью __запросов к базе данных__, которые составляются на языке запросов.
> В этой технике разработчик получает возможность оперировать отдельными полями таблиц базы данных, в которых хранятся те или иные данные.
> Табличная техника предназначена для получения информации из базы данных по некоторым условиям (отбор, группировка, сортировка, объединение нескольких выборок, расчет итогов и т. д.). Табличная техника оптимизирована для обработки больших объемов информации, расположенной в базе данных, и получения данных, отвечающих заданным критериям.
2024-04-04 10:27:37 +02:00
>
> _Источник: Практическое пособие разработчика, занятие 13_
2024-04-04 10:16:10 +02:00
2024-04-04 10:27:37 +02:00
Чтение наборов записей регистров через объектную модель приводит к наложению управляемой блокировки.<br />
_Пояснение: происходит неявная транзакция_
2024-04-04 10:16:10 +02:00
2024-04-04 13:18:05 +02:00
```bsl
Набор = РегистрыСведений.ВсеОбновленияНовостей.СоздатьНаборЗаписей();
Набор.Отбор.ВидОбновления.Установить("Получение новостей");
Набор.Прочитать();
```
В ТЖ этот код выглядит так:
> 06:48.552025,__SDBL__,5,process=rphost,p:processName=erp_demo_mssql,OSThread=5976,t:clientID=128,t:applicationName=1CV8C,t:computerName=er232,t:connectID=10,SessionID=5,Usr=Администратор,AppID=1CV8C,DBMS=DBMSSQL,DataBase=.\erp_demo_mssql,Trans=1,__Func=BeginTransaction__,Context='Форма.Вызов : Набор.Прочитать();'
> 06:48.568008,__TLOCK__,5,process=rphost,p:processName=erp_demo_mssql,OSThread=5976,t:clientID=128,t:applicationName=1CV8C,t:computerName=er232,t:connectID=10,SessionID=5,Usr=Администратор,AppID=1CV8C,DBMS=DBMSSQL,DataBase=.\erp_demo_mssql,Regions=InfoRg42238.DIMS,__Locks='InfoRg42238.DIMS Shared Fld42239="Получение новостей"'__,WaitConnections=,Context='Форма.Вызов : Набор.Прочитать();'
> 06:48.568015_15991,__SDBL__,4,process=rphost,p:processName=erp_demo_mssql,OSThread=5976,t:clientID=128,t:applicationName=1CV8C,t:computerName=er232,t:connectID=10,SessionID=5,Usr=Администратор,AppID=1CV8C,DBMS=DBMSSQL,DataBase=.\erp_demo_mssql,Trans=0,Func=Transaction,__Func=CommitTransaction__,Context='Форма.Вызов : Набор.Прочитать();'
2024-04-04 10:27:37 +02:00
Получение прикладного объекта через `ПолучитьОбъект()` всегда происходит с использованием объектной блокировки.<br />
_Пояснение: здесь имеется ввиду оптимистическая объектная блокировка, подробнее см. [Какие бывают блокировки](#какие-бывают-блокировки)_
2024-04-04 10:16:10 +02:00
Платформа НЕ устанавливает блокировок при чтении в объектной технике как минимум следующих объектов:
- констант и наборов констант;
- справочников (например, используя методы Справочники.ИмяСправочника.Выбрать(), СправочникВыборка.Следующий(), СправочникВыборка.ПолучитьОбъект(), СправочникСсылка.ПолучитьОбъект() и т.д.);
- документов (аналогично справочникам);
- других объектов (планов видов характеристик, планов счетов и т.д.
2024-04-04 10:27:37 +02:00
Чтение в объектной технике обладает еще одной особенностью: оно в ряде случаев выполняется в неявной транзакции.
2024-04-04 10:16:10 +02:00
> 3.15. Особенности чтения в объектной модели
>
> У чтения в объектной модели есть три особенности.
> 1. Иногда ставятся управляемые блокировки.
> 2. Иногда чтение происходит в неявной транзакции.
> 3. Считываются все данные.
> Разберем их по очереди
>
> ### 1. Иногда ставятся управляемые блокировки.
>
2024-04-04 10:27:37 +02:00
> Платформой устанавливаются управляемые __разделяемые__ блокировки при чтении в объектной технике следующих видов объектов:
2024-04-04 10:16:10 +02:00
> - набор записей регистра сведений,
> - набор записей регистра накопления,
> - набор записей регистра бухгалтерии,
> - набор записей регистра расчета,
> - набор записей перерасчета,
> - набор записей последовательности.
>
> ### 2. Иногда чтение происходит в неявной транзакции.
> Чтение в объектной технике объектов, имеющих табличные части\*, будет выполняться в неявной транзакции. Например, запрос
> `ДокументПроведен = ДокументСсылка.Проведен;` выполнится в транзакции, если для документа данного типа в конфигураторе определена
> табличная часть, но этот же запрос будет выполняться вне транзакции, если табличных частей у документа нет.
>
> \* _Анонсирован отказ от использования транзакций для этих целей в будущем, но есть ожидания,
> что на многих продуктивных системах еще на какое-то время сохранится существующее
> положение дел._
>
> ### 3. Считываются все данные.
> Если посмотреть с помощью замера на отладчике, как выполняется следующий код, то можно увидеть, что основное время
> всегда тратится на выполнение первой строки:
> ```
2024-04-04 10:27:37 +02:00
> ДокументПроведен = ДокументСсылка.Проведен; // <- запрос к БД будет здесь
2024-04-04 10:16:10 +02:00
> ДокументДата = ДокументСсылка.Дата;
> ДокументНомер = ДокументСсылка.Номер;
> ```
> Если пройти код пошагово отладчиком и при этом посмотреть трассировку в профайлере SQL Server, можно увидеть, что запрос (если есть еще и табличная
> часть, то несколько запросов в транзакции) выполняется только на первой строке, при этом тексты запросов содержат имена всех реквизитов и все табличные части.
> На второй и на третьей строке запросы к базе уже не выполняются.
2024-04-04 10:27:37 +02:00
>
> _Источник: Филлипов Е.В., Настольная книга Эксперта по технологическим вопросам, 2-е издание, стр. 56-57_
2024-04-04 10:16:10 +02:00
2022-07-28 06:13:19 +02:00
--------------------------------------------------
2024-04-04 10:16:10 +02:00
## Какие бывают блокировки
2023-10-25 12:10:12 +02:00
* Объектные блокировки: https://infostart.ru/public/543218/
* Пессимистические (явные и неявные)
* Оптимистические
2024-04-04 10:16:10 +02:00
### Объектная оптимистическая блокировка
2023-10-25 12:10:12 +02:00
Оптимистическая блокировка представляет собой проверку, которая выполняется перед записью объекта в базу данных. У объекта есть свойство «ВерсияДанных», которая вместе с объектом считывается из базы данных. Оптимистическая блокировка производит перед записью производит сравнение значения свойства «ВерсияДанных» объекта, который находится в оперативной памяти с значением свойства «ВерсияДанных» объекта находящийся в базе данных. Если значения свойства «ВерсияДанных» у объектов отличается, то оптимистическая блокировка запрещает запись объекта в базу данных и выдает сообщение об ошибке.
2024-04-04 10:16:10 +02:00
### Объектная пессимистическая блокировка (неявная, в форме)
2023-10-25 12:10:12 +02:00
Пессимистическая объектная блокировка предназначена для запрета изменений данных объекта, пока блокировка не будет снята. Система (с помощью соответствующих расширений формы объекта) автоматически устанавливает пессимистическую блокировку, в момент, когда пользователь пытается произвести изменение данных объекта. Если после этого другой пользователь, например, попытается выполнить редактирование того же объекта, ему будет выдано сообщение о том, что не удалось заблокировать объект.
2024-04-04 10:16:10 +02:00
### Объектная пессимистическая блокировка (явная, в коде)
2023-10-25 12:10:12 +02:00
* Без формы (обычные формы)
Методы «Заблокировать()», «Разблокировать()» и «Заблокирован()», используются для объектов базы данных, существуют только на сервере. Метод «Заблокирован()» не может быть использован для проверки, заблокирован ли вообще объект базы данных, например, другими пользователями. Для этого следует использовать метод «Заблокировать()» в попытке.
* Управляемы формы
Для работы с блокировками из управляемой формы без вызова сервера можено использовать методы: «ЗаблокироватьДанныеФормыДляРедактирования()» и «РазблокироватьДанныеФормыДляРедактирования()». Данные методы используются для блокировки или разблокировки данных основного реквизита формы. Контролируются флагом «Сохраняемые данные». Данный флаг определяет будет ли при интерактивном редактировании блокироваться данные основного реквизита, или нет.
--------------------------------------------------
Какие бывают блокировки:
2023-10-25 12:36:31 +02:00
* Транзакционные (на сервере 1с)
2023-10-25 12:10:12 +02:00
* управляемые
* автоматические
--------------------------------------------------
Какие бывают блокировки:
* Транзакционные:
* исключительные
2023-10-25 12:32:47 +02:00
* на сервере 1с
* на сервере субд
2023-10-25 12:10:12 +02:00
* разделяемые
2023-10-25 12:32:47 +02:00
* на сервере 1с
* а сервере субд
2023-10-25 12:10:12 +02:00
--------------------------------------------------
Какие бывают блокировки:
* Транзакционные:
* явные
2023-10-25 12:36:31 +02:00
* на сервере 1с
2023-10-25 12:10:12 +02:00
* неявные
2023-10-25 12:36:31 +02:00
* на сервере 1с
* на сервере субд
2023-10-25 12:27:59 +02:00
--------------------------------------------------
2024-04-04 10:16:10 +02:00
### Эскалация блокировок в ТЖ
2023-10-25 12:27:59 +02:00
2023-10-25 12:28:33 +02:00
* В mssql\
2023-10-25 12:37:48 +02:00
события Lock:Escalation. Укрупнение происходит в случае, если количество блокировок в определенном просмотре превышает 5000 http://www.gilev.ru/escalation/
2023-10-25 12:28:33 +02:00
* в платформе\
2023-10-25 12:29:40 +02:00
событие Locks без указания конкретных полей и значений. для 8.2 - более 20 тыс. на одно пространство, для 8.3 - более 100тыс. на одно пространство https://курсы-по-1с.рф/news/2017-12-22-optimization-1c-escalation-of-locks/
2023-11-24 07:01:28 +02:00
![alt text](Избыточные%20блокировки.%20Подготовка%20к%20сдаче%20экзамена%201С_Эксперт%207-37%20screenshot%20Блокировки%20СУБД%20Гранулярность.png)
2023-11-24 07:02:48 +02:00
2024-04-04 10:16:10 +02:00
### Ссылки
2023-11-24 07:02:48 +02:00
* https://www.youtube.com/watch?v=BsZAhSxUh9k - Избыточные блокировки. Подготовка к сдаче экзамена 1С:Эксперт