Difference between revisions of "LockObject"

From SunFlurry wiki
Jump to: navigation, search
 
m (1 revision imported)
 
(No difference)

Latest revision as of 08:51, 7 February 2021

  LockObject (Блокировка объектов)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Визуальность:Нет

Функция позволяет заблокировать доступ к сложному объекту из других программных потоков. Функция не должна применяться к однопоточным объектам, перед блокировкой объект будет превращен в многопоточный. Обычно система выполняет это действие автоматически, однако, если состояние непротиворечивости объекта требует нескольких вызовов функций изменения, эта функция может стать гарантом его непротиворечивости в других потоках. После окончания выполнения кода изменения объекта, необходимо вызвать функцию UnlockObject. Функция не должна применяться к визуальным объектам, иначе может возникнуть ситуация взаимной блокировки, так как система использует те же самые механизмы блокировки для внутренней синхронизации между рабочими и визуальным потоком, и, если объект является визуальным (к примеру, таблица значений, привязана к таблице на форме), в момент его изменения будет вызван визуальный поток, который чтобы отразить изменение на экране, попытается сам заблокировать объект, произойдет взаимная блокировка потоков и система перестанет отвечать на команды пользователя. Нужно понимать разницу между такой блокировкой объекта на системном уровне и блокировками визуальных объектов. Таблица, данная ниже, объясняет эту разницу.

Тип блокировки Разрешено вложение Примеры функций Описание
Блокировка объектов на уровне системы Да (объект будет разблокирован после такого же количества вызовов UnlockObject, сколько было вызовов LockObject) LockObject, UnlockObject, LockCount Производится блокировка доступа к объекту из других потоков. Используется, когда для сохранения непротиворечивого состояния объекта необходимо сделать более одного изменения, к примеру, изменить в строке таблицы, которая используется в других потоках, сразу несколько значений. Если достаточно изменить только одно значение, не имеет смысла использовать подобную блокировку, так как система самостоятельно блокирует сложные объекты при их чтении или записи. Требуется конструкция Try ... Finally, чтобы снять блокировку гарантированно.
Блокировка визуальных элементов форм Нет (Unlock всегда разблокирует, вне зависимости от количества вызовов Lock) Tab.Lock, Tab.Unlock, List.Lock, List.Unlock, Tree.Lock, Tree.Unlock, Table.Lock, Table.Unlock, Picture.Lock, Picture.Unlock Производится блокировка трансляции изменений на экран, сделанных в объекте в программе. Данная блокировка используется для ускорения работы с объектами, которые уже выведены на экран. Если электронная таблица еще не выведена на экран, нет никакого смысла проводить такую блокировку, так как она не ускорит работы с таблицей. Требуется конструкция Try ... Finally, чтобы снять блокировку гарантированно.
Блокировка объектов базы данных N/A DB.Lock, DB.Unlock, MassLockWithWait, MassUnlock Производится блокировка объекта базы данных на сервере. Клиент выполняет такую блокировку автоматически, когда пользователь открывает элемент справочника или документ визуально. Программная блокировка необходима, если нужно заблокировать группу объектов до их изменения, либо необходимо произвести несколько последовательных изменений в одном объекте. После блокировки объекта, если это не новый объект, рекомендуется загрузить его содержимое заново с помощью DB.Reload, чтобы избежать записи устаревшей информации и, тем самым, утери более свежих изменений. Разблокировка происходит при удалении объекта из системы, закрытии визуально закрытого объекта, либо вызове функции разблокировки.
Блокировка накопителей и определенных видов объектов. N/A LockStorage, UnlockStorage, LockDBPath, UnlockDBPath Производится блокировка накопителя или другого объекта для всех пользователей системы. Блокировка используется перед критической проверкой содержания накопителя, для того, чтобы убедиться, что после проверки перед записью накопитель не был изменен. Такая блокировка обычно сопровождается транзакцией BeginTransaction, даже без вызова LockStorage, она инициируется автоматически при вызове некоторых функций, типа ClearStorages, SaveStorage. Разблокировка происходит автоматически при окончании транзакции, ошибке или окончании выполнения программного модуля. Более подробную информацию см. в статье LockStorage.
Блокировка серверных семафоров N/A DBLockStringMutex, DBUnlockStringMutex, MassLockWithWait, MassUnlock Производится блокировка именованных семафоров на сервере. Блокировка необходима, если нужно заблокировать доступ к процессу, не связанному с элементами базы данных (например, к файловому каталогу на сервере). Требуется конструкция Try ... Finally, чтобы снять блокировку гарантированно.
Транзакции базы данных Да (фактически транзакция будет зафиксирована после такого же количества CommitTransaction, сколько было вызовов BeginTransaction, однако, RollbackTransaction отменяет все уровни транзакции). BeginTransaction, CommitTransaction, RollbackTransaction Блокировка изменения любых таблиц на сервере базы данных для других клиентов, после того, как они были изменены текущим внутри транзакции, называется блокировкой транзакции. Транзакция может окончится принятием изменений, сделанных внутри нее, либо отказом от них, после чего, таблицы становятся доступными для записи других клиентов. Транзакция может происходить очень незаметно для других клиентов, а может замедлять скорость работы всех пользователей системы, в зависимости от типа объекта, для которого она происходит. По умолчанию работа клиента на сервере базы данных идет вне транзакции, однако, при записи изменений в объекты, сервер базы данных может создавать кратковременную транзакцию (хотя практически, это не делается, так как сервер разграничивает доступ клиентов с помощью внутреннего механизма блокировок). Транзакция, однако, создается сервером автоматически при обработке документов, причем, при этом происходит блокировка не отдельных объектов, а видов объектов (накопителей), поэтому, корректная оптимизация кода обработки документов очень важна. Программа использует транзакции, когда результат записи изменений множества связанных объектов нельзя предсказать заранее. Требуется конструкция Try ... Finally, чтобы окончить транзакцию гарантированно, иначе транзакция будет отменена системой автоматически после окончания выполнения кода.
Блокировка системных семафоров N/A Mutex.CreateMutex Производится блокировка системного семафора, что позволяет исключить доступ к одному и тому же имени для двух или более запущенных клиентов на одной и той же машине, либо позволяет производить простое разграничение доступа между клиентом и другими приложениями. Разблокировка происходит при удалении объекта из системы.

Синтаксис

LockObject(<Аргумент>)

Аргументы

  • <Аргумент> - Сложный объект, который необходимо заблокировать. Использование простых объектов разрешается, но не имеет смысла.


Примеры

//спСобытие -- список, используемый глобально, хранящий последнюю позицию события на карте и его наименование.
//Любой поток может использовать информацию об этом объекте, чтобы отразить его на карте при запросе с web-страницы,
//поэтому при обновлении или чтении необходимо производить блокировку, чтобы не получить координату X от одного
//события, а координату Y и наименование от следующего.
//Здесь дана версия функции, которая производит запись в список поступившей новой информации (аШирота, аДолгота, стрСобытие)
LockObject(спСобытие);
Try
  спСобытие.SetByName("x",аДолгота);
  спСобытие.SetByName("y",аШирота);
  спСобытие.SetByName("name",стрСобытие);
Finally
  UnlockObject(спСобытие);
EndTry;