Выполнение транзакций, ориентированное на данные

       

Выполнение запросов


DORA направляет к одному исполнителю все действия, которые должны выполняться над одним и тем же набором данных. Исполнитель отвечает за поддержку изоляции и упорядочивания конфликтующих действий. Теперь мы опишем, как в среде DORA выполняются транзакции. Подробный пример выполнения одной транзакции в среде DORA представлен в приложении (раздел A.1).

С каждым исполнителем ассоциируются три структуры данных: очередь поступающих действий, очередь завершенных действий и локальная для потока управления таблица блокировок. Действия обрабатываются в том порядке, в каком они заносятся во входную очередь. Для выявления конфликтных действий исполитель использует локальную таблицу блокировок. Разрешение конфликтов происходит на уровне идентификаторов действий. Другими словами, на вход локальной таблицы блокировок поступают идентификаторы действий. У локальных блокировок имеется всего два режима: совместный (shared) и монопольный (exclusive). Поскольку идентификаторы действий могут содержать только часть первичного ключа, используемая схема блокировок похожа на схему блокировок префиксов ключей (key-prefix locks) [8]. Действие, получившее требуемую блокировку, может продолжать выполнение без централизованного управления параллелизмом. Каждое действие сохраняет полученную им локальную блокировку до фиксации (или аварийного завершения) всей транзакции. В заключительной RVP каждая транзакция сначала ожидает ответа от основного менеджера хранения данных относительно завершения фиксации (или аварийного прекращения транзакции). Затем все действия, участвовавшие в транзакции, ставятся в очереди завершенных действий своих исполнителей. Каждый исполнитель удаляет из своей локальной таблицы блокировок элементы, соответствующие блокировкам этих действий, и последовательно выполняет ранее блокированные действия, которые теперь могут получить требуемые блокировки.

Каждый исполнитель неявно удерживает блокировку монопольного намерения (intent exclusive, IX) для всей таблицы и не вынужден взаимодействовать с централизованным менеджером блокировок для ее получения для каждой транзакции. Транзакции, намеревающиеся модифицировать крупные диапазоны данных, охватывающие несколько наборов данных или покрывающие всю таблицу, (например, уничтожающие таблицу) ставят действие в очередь ко всем исполнителям, обрабатывающим части этой таблицы. Такую "многораздельную" транзакцию можно будет выполнить, как только всем ее действиям будет разрешен доступ. В рабочих нагрузках обработки транзакций такие операции препятствуют параллелизму, и поэтому в масштабируемых приложениях они встречаются редко.



Содержание раздела