Классика баз данных - статьи

       

Логические блокировки


В этом подразделе мы описываем логические блокировки, которые в XDGL используются для предотвращения фантомов.

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

  1. операция модификации расширяет схему (добавляет новый путь),
  2. эта модификация приводит к изменению целевых узлов предыдущих операций чтения или модификации других транзакций.

Чтобы избежать появление узлов-фантомов, мы вводим две дополнительные блокировки: L и IN. L (logical) блокировка устанавливается на узел схемы для предотвращения появления фантомов в поддереве, соответствующем этому узлу. При требовании установки L-блокировки специфицируется набор свойств для узлов в документе. Свойства узлов документа выражаются при помощи условий на имя узла и его значение. L-блокировка запрещает вставку новых узлов в поддерево, если вставка приводит к расширению схемы, и вставляется узел со свойствами, указанными в L блокировке. В свою очередь, транзакция, которая расширяет схему, должна установить блокировку IN (insert new node) для каждого предка вставляемого узла. При требовании установки IN- блокировки также специфицируется набор свойств вставляемого узла.

Ниже указаны все возможные комбинации для свойств L-блокировки (relop - это операция сравнения):

  • node-name='name1' (например, для запроса //person);
  • node-name='name1', node-value relop 'val1' (например, для запроса //name[.≠'John']);
  • node-name='name1', child-name='name2', child-value relop 'val1' (например, для запроса //person[name ≠ 'John']).



    Содержание  Назад  Вперед