В этом подразделе мы описываем логические блокировки, которые в XDGL используются для предотвращения фантомов.
Прежде всего рассмотрим, в каких ситуациях могут появляться фантомы. Предположим, что транзакция T1 читает все атрибуты age в XML-документе GTree (см. ), используя запрос //@age. В это же время транзакция T2 вставляет новый атрибут age, используя операцию: InsertInto(attribute age {30}, /doc/person/child/person). При повторном чтении всех атрибутов age транзакция T1 прочитает новый атрибут-фантом age, вставленный второй транзакцией. В общем случае, фантомы могут появляться в случае, если
Чтобы избежать появление узлов-фантомов, мы вводим две дополнительные блокировки: L и IN. L (logical) блокировка устанавливается на узел схемы для предотвращения появления фантомов в поддереве, соответствующем этому узлу. При требовании установки L-блокировки специфицируется набор свойств для узлов в документе. Свойства узлов документа выражаются при помощи условий на имя узла и его значение. L-блокировка запрещает вставку новых узлов в поддерево, если вставка приводит к расширению схемы, и вставляется узел со свойствами, указанными в L блокировке. В свою очередь, транзакция, которая расширяет схему, должна установить блокировку IN (insert new node) для каждого предка вставляемого узла. При требовании установки IN- блокировки также специфицируется набор свойств вставляемого узла.
Ниже указаны все возможные комбинации для свойств L-блокировки (relop - это операция сравнения):