List.Lock

From SunFlurry wiki
Revision as of 08:42, 27 November 2023 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  Lock (Работа с блокировками)
Объект:Список
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Визуальность:Да

Функция запрещает выполнения обновления визуального списка при любом его изменении до тех пор, пока не будет вызвана функция Unlock. Функция может использоваться перед большим количеством обновлений или заполнении большого списка для получения значительного ускорения операции. Функцию необходимо использовать совместно с конструкцией Try .. Finally для исключения вероятности появления нерабочего списка на форме. Ниже дана таблица, показывающая разницу между различными типами блокировок в системе.

Тип блокировки Разрешено вложение Примеры функций Описание
Блокировка объектов на уровне системы Да (объект будет разблокирован после такого же количества вызовов 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 Производится блокировка системного семафора, что позволяет исключить доступ к одному и тому же имени для двух или более запущенных клиентов на одной и той же машине, либо позволяет производить простое разграничение доступа между клиентом и другими приложениями. Разблокировка происходит при удалении объекта из системы.

Синтаксис

List.Lock()

Примеры

//Пример, заполняющий визуальный список большим количеством элементов
ТЗ:="Эл:=Ref.Номенклатура;
|Condition(Эл IN спНоменклатура);
|Group Эл;";
З:=Query.Create();
aTab:=З.Execute(ТЗ,0);
MassLoadObjects(aTab,,,,2);

aList.Lock();
Try
  aList.Clear();
  bTab.Select();
  While bTab.Next() Do
    aList.Add(bTab.Эл);
  EndDo;
Finally
  aTab.Unlock();
EndTry;