Распределенная обработка данных. Найханова Л.В. - 61 стр.

UptoLike

Составители: 

61
выполняет оператор A выборки кортежей отношения R с условием выборки S (т.е.
выбирается часть кортежей отношения R, удовлетворяющих условию S). До завершения
транзакции 1 транзакция 2 вставляет в отношение R новый кортеж r, удовлетворяющий
условию S, и успешно завершается. Транзакция 1 повторно выполняет оператор A, и в
результате появляется кортеж, который отсутствовал при первом выполнении оператора.
Конечно, такая ситуация противоречит идее изолированности транзакций и может
возникнуть даже на третьем уровне изолированности транзакций. Чтобы избежать
появления кортежей-фантомов, требуется более высокий "логический" уровень
синхронизации транзакций. Поясним как это можно делать.
Поскольку любая операция над реляционной базой данных задается некоторым
условием (т.е. в ней указывается не конкретный набор объектов базы данных, над
которыми нужно выполнить операцию, а условие, которому должны удовлетворять
объекты этого набора), идеальным выбором было бы требовать синхронизационный
захват в режиме S или X именно этого условия. Но если посмотреть на общий вид
условий, допускаемых, например, в языке SQL, то становится абсолютно непонятно, как
определить совместимость двух предикатных захватов. Ясно, что без этого использовать
предикатные захваты для синхронизации транзакций невозможно, а в общей форме
проблема неразрешима.
К счастью, эта проблема сравнительно легко решается для случая простых условий.
Будем называть простым условием конъюнкцию простых предикатов, имеющих вид
имя-атрибута { = > < } значение
В типичных СУБД, поддерживающих двухуровневую организацию (языковой
уровень и уровень управления внешней памяти), в интерфейсе подсистем управления
памятью (которая обычно заведует и сериализацией транзакций) допускаются только
простые условия. Подсистема языкового уровня производит компиляцию исходного
оператора со сложным условием в последовательность обращений к ядру СУБД, в каждом
из которых содержатся только простые условия. Следовательно, в случае типовой
организации реляционной СУБД простые условия можно использовать как основу
предикатных захватов.
Для простых условий совместимость предикатных захватов легко определяется на
основе следующей геометрической интерпретации. Пусть R отношение с атрибутами a1,
a2, ..., an, а m1, m2, ..., mn - множества допустимых значений a1, a2, ..., an соответственно
(все эти множества - конечные). Тогда можно сопоставить R конечное n-мерное
пространство возможных значений кортежей R. Любое простое условие "вырезает" m-
мерный прямоугольник в этом пространстве (m <= n).
Тогда S-X, X-S, X-X предикатные захваты от
разных транзакций совместимы, если
соответствующие прямоугольники не пересекаются.
Это иллюстрируется следующим примером,
показывающим, что в каких бы режимах не требовала
транзакция 1 захвата условия (1<=a<=4) & (b=5), а
транзакция 2 - условия (1<=a<=5) & (1<=b<=3), эти
захваты всегда совместимы.
Пример: (n = 2)
Рис.5.13.
выполняет оператор A выборки кортежей отношения R с условием выборки S (т.е.
выбирается часть кортежей отношения R, удовлетворяющих условию S). До завершения
транзакции 1 транзакция 2 вставляет в отношение R новый кортеж r, удовлетворяющий
условию S, и успешно завершается. Транзакция 1 повторно выполняет оператор A, и в
результате появляется кортеж, который отсутствовал при первом выполнении оператора.
Конечно, такая ситуация противоречит идее изолированности транзакций и может
возникнуть даже на третьем уровне изолированности транзакций. Чтобы избежать
появления кортежей-фантомов, требуется более высокий "логический" уровень
синхронизации транзакций. Поясним как это можно делать.
     Поскольку любая операция над реляционной базой данных задается некоторым
условием (т.е. в ней указывается не конкретный набор объектов базы данных, над
которыми нужно выполнить операцию, а условие, которому должны удовлетворять
объекты этого набора), идеальным выбором было бы требовать синхронизационный
захват в режиме S или X именно этого условия. Но если посмотреть на общий вид
условий, допускаемых, например, в языке SQL, то становится абсолютно непонятно, как
определить совместимость двух предикатных захватов. Ясно, что без этого использовать
предикатные захваты для синхронизации транзакций невозможно, а в общей форме
проблема неразрешима.
     К счастью, эта проблема сравнительно легко решается для случая простых условий.
Будем называть простым условием конъюнкцию простых предикатов, имеющих вид

                                имя-атрибута { = > < } значение

       В типичных СУБД, поддерживающих двухуровневую организацию (языковой
уровень и уровень управления внешней памяти), в интерфейсе подсистем управления
памятью (которая обычно заведует и сериализацией транзакций) допускаются только
простые условия. Подсистема языкового уровня производит компиляцию исходного
оператора со сложным условием в последовательность обращений к ядру СУБД, в каждом
из которых содержатся только простые условия. Следовательно, в случае типовой
организации реляционной СУБД простые условия можно использовать как основу
предикатных захватов.
       Для простых условий совместимость предикатных захватов легко определяется на
основе следующей геометрической интерпретации. Пусть R отношение с атрибутами a1,
a2, ..., an, а m1, m2, ..., mn - множества допустимых значений a1, a2, ..., an соответственно
(все эти множества - конечные). Тогда можно сопоставить R конечное n-мерное
пространство возможных значений кортежей R. Любое простое условие "вырезает" m-
мерный прямоугольник в этом пространстве (m <= n).
       Тогда S-X, X-S, X-X предикатные захваты от
разных          транзакций         совместимы,     если
соответствующие прямоугольники не пересекаются.
       Это иллюстрируется следующим примером,
показывающим, что в каких бы режимах не требовала
транзакция 1 захвата условия (1<=a<=4) & (b=5), а
транзакция 2 - условия (1<=a<=5) & (1<=b<=3), эти
захваты всегда совместимы.

     Пример: (n = 2)



                                                                           Рис.5.13.


                                                                                          61