В данной статье речь пойдет о блокировках – что это, зачем нужны, какие бывают? Также рассмотрим проблемы связанные с неверной работой блокировок, их отсутствием или напротив – избыточными блокировками.
Разбираемся в терминологии
Если простыми словами – то блокировка данных в 1С – это запись о том, что какой-то ресурс захвачен кем-то для выполнения каких-то действий.
Часть блокировок реализовано средствами самой платформы 1С – они называются объектные блокировки. Другая часть ложится на плечи СУБД – это транзакционные блокировки. Наличие этих двух видов блокировок обусловлено подходами к представлению данных. 1С рассматривает данные в первую очередь как неделимые объекты, которые редактируются целиком – например, карточка конкретного товара, или конкретный документ. А для СУБД все данные – это набор связанных между собой таблиц.
Зачем вообще нужны блокировки в 1С?
1С – многопользовательская система, и должна обеспечивать возможность одновременной записи и чтения различных данных несколькими пользователями, и при этом сохранять целостность, непротиворечивость и достоверность данных. В процессе работы системы возникает конкурентный доступ к ресурсам – например, один пользователь записывает документ поступления товаров, а другой в это же время смотрит отчет по остаткам на складе.
Объектные блокировки, которые контролируются самой платформой 1С, предназначены для обеспечения конкурентного доступа пользователей к объектам базы данных – например, конкретному элементу справочника, конкретному документу и т.д.
Транзакционные блокировки контролируются СУБД – например MS SQL сервером или PostgreSQL. Любая СУБД должна обеспечивать целостность и непротиворечивость хранящихся в ней данных. Для того, чтобы данные изменялись согласованно в разных таблицах, используются транзакции. А для обеспечения конкурентного доступа в свою очередь – транзакционные блокировки.
Стакан наполовину пуст?
Объектные блокировки делятся на пессимистические и оптимистические.
Пессимистическая блокировка гарантирует, что пользователь, начав изменять данные объекта, сможет эти изменения записать. Этот вид блокировки накладывается в момент начала редактирования данных из формы объекта, либо средствами встроенного языка. Пока блокировка активна, другие пользователи не смогут начать редактирование того же объекта.
Оптимистическая блокировка – это по сути проверка версии объекта перед записью. Оптимистическая блокировка запрещает запись данных в базу, если объект был изменен в другом сеансе или программным образом в этом же сеансе, и обеспечивает гарантию того, что пользователь изменяет актуальные данные, а не какую-то старую версию.
Почему объектные блокировки так называются?
мне попалась такая версия, и я в целом с ней согласен:
– объект-оптимист считает, что ничего не изменится, пока вы его читаете;
-объект-пессимист думает, что будет что-то нехорошее, и поэтому блокирует попытки изменения на время редактирования.
Транзакционные блокировки
Как очевидно из названия, данные блокировки тесно связаны с понятием “Транзакция”. Транзакция работает по принципу “все или ничего” – либо все действия в рамках транзакции успешно и без ошибок записываются, либо происходит “откат транзакции”, и в этом случае никаких изменений в базу не вносится.
Транзакционные блокировки 1С делятся на два вида – автоматические и управляемые.
Автоматические транзакционные блокировки управляются полностью средствами СУБД, и повлиять на них разработчик средствами языка 1С не может. Автоматические блокировки иногда приводят к избыточному блокированию данных. Например, мы хотим заблокировать данные только по покупателю Иванов, чтобы записать поступление оплаты, а СУБД полностью блокирует всю таблицу взаиморасчетов, и в этом случае другой пользователь вынужден ждать, пока будут записаны данные об оплате Иванова, чтобы записать оплату, к примеру, от Петрова. Поэтому если к системе предъявляются высокие требования к параллельности работы, автоматические блокировки – не лучший вариант. В то же время, они позволяют значительно упростить разработку прикладного решения, т.к. все управление блокировками лежит на СУБД.
Управляемые блокировки – это блокировки, осуществленные средствами собственного менеджера блокировок 1С, который не зависит от используемой СУБД. Данный вид блокировок требует программного управления средствами встроенного языка в тех ситуациях, когда требуется запретить чтение другими транзакциями, или обеспечить неизменность считываемых в транзакции данных. Управляемые блокировки позволяют значительно повысить параллельность работы пользователей за счет гораздо более точного блокирования данных, и при этом избежать избыточных блокировок. При этом соблюдаются правила целостности и непротиворечивости данных.
Ошибки из-за неправильной работы транзакционных блокировок
При одновременном чтении и изменении одних и тех же данных конкурирующими транзакциями могут возникнуть следующие проблемы одновременного доступа
- Проблема потерянных изменений
- Проблема неповторяющегося чтения
- Проблема чтения грязных данных
- Проблема чтения фантомов
Более подробно вы можете ознакомиться например, в статье Википедии.
И еще кое-что о блокировках на уровне СУБД
Из статьи в статью, с сайта на сайт кочует текст про “физическое расположение блокировок” и про виды блокировок:
S – разделяемая блокировка для чтения
X – исключительная блокировка для записи
U – блокировка для обновления.
И все бы хорошо, но только почти нигде не указывается, что речь идет только о блокировках конкретной СУБД, а именно – MS SQL Server. Так вот. Видов блокировок, которые существуют в этой СУБД, более 20. Но 1С использует только эти три. Далее, для других СУБД названия блокировок будут другие, хотя и с тем же смыслом. Например. в Oracle это будут RS, RX, TX и другие.
Я думаю, широкое распространение текстов именно про блокировки S, X и U связаны с тем что для 1С СУБД MS SQL Server занимает очень значительную долю среди остальных.
Поэтому призываю читателей критически воспринимать информацию, проводить самостоятельные исследования и глубже вникать в материал. Кто знает, вдруг однажды вы блеснете приобретенными знаниями на собеседовании?