Получить консультацию

Блокировки данных на уровне 1С и СУБД

В данной статье речь пойдет о блокировках — что это, зачем нужны, какие бывают? Также рассмотрим проблемы связанные с неверной работой блокировок, их отсутствием или напротив — избыточными блокировками.

Разбираемся в терминологии

Если простыми словами — то блокировка данных в 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 занимает очень значительную долю среди остальных.
Поэтому призываю читателей критически воспринимать информацию, проводить самостоятельные исследования и глубже вникать в материал. Кто знает, вдруг однажды вы блеснете приобретенными знаниями на собеседовании?

Оставьте комментарий

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

девятнадцать − двенадцать =

К НАЧАЛУ