
5.6. Распределенные транзакции 311
стоять из одной или более транзакций или, в свою очередь, делиться на дочерние
транзакции.
Вложенные транзакции поднимают перед нами небольшую, но важную про-
блему. Представьте себе, что транзакция запускает несколько параллельных
дочерних транзакций, и одна из них завершается, делая результат видимым для
родительской транзакции. В ходе дальнейших вычислений родительская транз-
акция прерывается, возвращая систему в то состояние, в котором она была до
запуска транзакции верхнего уровня. Вместе с другими промежуточными резуль-
татами теряются и результаты завершившейся дочерней транзакции. Таким об-
разом, долговечность, о которой мы говорили, применима только к транзакциям
верхнего уровня.
Поскольку глубина вложенности транзакций может быть произвольно глубо-
кой, для сохранения правильности необходимо серьезное администрирование.
Однако семантика ясна. Когда начинается любая транзакция или вложенная
транзакция, создается закрытая копия данных всей системы. Если транзакция
прерывается, ее внутренняя вселенная исчезает, как будто ее никогда и не было.
Если она завершается, ее внутренняя вселенная замещает родительскую. Таким
образом, если дочерняя транзакция завершается и начинается новая дочерняя
транзакция, вторая из них получает возможность работать с результатами, соз-
данными первой. Таким же образом, если прерывается объемлющая (верхнего
уровня) транзакция, все вложенные в нее дочерние транзакции также преры-
ваются.
Распределенные транзакции
Вложенные транзакции важны для распределенных систем, потому что OHPI пре-
доставляют естественный способ распределения транзакций по нескольким ма-
шинам. Однако вложенные транзакции обычно делят работу исходной транзак-
ции
логически.
Например, транзакция, в ходе которой следовало зарезервировать
билеты на три различных самолета (см. листинги 5.1 и 5.2), может быть логиче-
ски разделена на три вложенные транзакции. Каждая из этих вложенных транз-
акций может управляться отдельно, независимо от остальных двух.
Однако логическое разделение вложенных транзакций на вложенные транз-
акции не обязательно означает, что все распределение в этом и состоит. Так, вло-
женная транзакция резервирования места в самолете от Нью-Йорка до Найроби
может нуждаться в доступе к двум базам данных, по одной для каждого из этих
городов. В этом случае вложенная транзакция может разделяться дальше, на
меньшие вложенные транзакции, которые логически уже не существуют, посколь-
ку резервирование само по себе является неделимой операцией.
В
этом случае вложенные транзакции (плоские) работают с данными, распре-
деленными по нескольким машинам. Такие транзакции известны под названием
распределенных
транзакций {distributed transactions). Разница между вложен-
ными и распределенными транзакциями невелика, но существенна. Вложенные
транзакции
—
это транзакции, которые логически разделяются на иерархически
организованные дочерние транзакции. В противоположность им распределен-
ные транзакции логически представляют собой плоские, неделимые транзакции,