Семафорные логические блокировки позволяют разделять доступ группам пользователей к любым объектам, которым можно присвоить идентификатор внутри группы. Объектами могут выступать таблицы, записи, директории, группы файлов и любые абстрактные объекты. На один объект может быть наложено НЕСКОЛЬКО Shared-блокировок или одна Exlusive, при этом блокировки "знают" имя своего хозяина и момент блокирования. Такие нефизические блокировки организуются в виде независимого механизма во внешнем семафорном списке.
Примерами типовых задач для таких блокировок являются:
1) Разделение доступа к группе файлов в директории - захват и манипуляция с группой любых файлов
разного типа, при этом остальные пользователи не должны иметь доступ к этой группе файлов на время
сеанса.
2) Групповая блокировка для записи - группа пользователей редактирует одну запись, блокируя ее в
режиме Shared, при этом для удаления эта запись недоступна.
Блокировки организуются в виде внешней таблицы семафорных блокировок, в которую заносится запись
о блокировке с информацией об :
1) идентификаторе объекта
2) имени пользователя
3) режиме блокировки (монопольная или разделяемая)
4) времени и дате установки блокировки
При аварийном завершеннии приложения, выставившего блокировку, она автоматически дезактивируется в
семафоре. Освободившиеся записи используются для других блокировок, оптимизируя механизм от
разбухания таблицы и необходимости ее упаковки.
Логические блокировки позволяют гибко отрегулировать множественный доступ к нестандартным
объектам, не производя ФИЗИЧЕСКУЮ блокировку стандартных объектов БД (таблиц и записей). Для
полной и правильной работы с записями требуется использование в них уникальных первичных ключей.
В приложенном файле slock.prg находятся набор автономных функций (SemLock, SemUnlock и SemLocked)
с тестовым примером, иллюстрирующие многопользовательские блокировки для абстрактных объектов. Для
проверки необходимо откомпилировать файл и запустить его несколько раз (каждая сессия будет
имитировать пользователя).