Программирование >>  Хронологические базы данных 

1 ... 175 176 177 [ 178 ] 179 180 181 ... 348


транзакций и т.д.); объема вычислений, выполняемых во время перезагрузки/восстановления; степени параллельности вычислений, выполняемых во время перезагрузки/восстановления; уровня откатов транзакций, вызванных ситуациями взаимной блокировки в системе; ограничений, накладываемых на хранимые данные (например, требований уникальности ключей для всех записей, ограничений максимального размера объектов до размера страницы и т.д.); способности поддерживать новые режимы блокировки, в которых допускается параллельное выполнение (на основе коммутативности и других свойств) таких операций, как инкремент/декремент для тех же данных, но разными транзакциями и т.д. По этим критериям [ARIES] оценивается очень высоко .

Со времени создания метода ARIES появилось множество его усовершенствований, разработано и описано в литературе несколько специализированных версий: ARIES/CS (для систем с архитектурой клиент/сервер ), ARIES/IM (для обработки индексов) и ARIES/NT (для вложенных транзакций) и т.д.

Ответы к некоторьш упражнения]

14.1. Подобные действия будут противоречить понятию атомарность транзакции . Если бы транзакция зафиксировала некоторые, не все свои, обновления, то незафиксированные обновления можно было бы впоследствии аннулировать, в то время как зафиксированные, конечно же, отменить было бы уже невозможно. Таким образом, для транзакции не будет выполнено условие атомарности, требуюшее выполнить все или ничего .

14.2. Подобное решение будет противоречить понятию атомарность транзакции . Предположим, что транзакция В была вложена в транзакцию А. Тогда последовательность событий будет такой (для простоты предположим, что имеет смысл говорить об обновлении кортежа ).

BEGIN TRANSACTION (транзакция А) ;

BEGIN TRANSACTION (транзакция В] транзакция В обновляет кортеж t COMMIT (транзакция В) ;

ROLLBACK (транзакция А) ;

Если кортеж b восстанавливается до своего предыдущего значения (назовем его рге-А), то фиксация (COMMIT) транзакции В, по сути, не происходит полностью. Однако если фиксация (COMMIT) транзакции В была истинной, то кортеж Ь не может быть восстановлен до своего значения рге-А и, следовательно, откат (ROLLBACK) транзакции А не может быть успешным.

Требование того, чтобы транзакции не могли вкладываться одна в другую, означает возможность выполнения команды BEGIN TRANSACTION только в том случае, если не выполняются никакие транзакции.

Однако многие авторы (начиная с Дэвиса [14.7]) предложили реализовать возможность вложения транзакций за счет отмены требования долговечности (свойство D в АСЮ-свойствах) по отношению к части внутренней транзак-



14.4.

14.6.

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

Полезно будет детальнее рассмотреть упомянутые выше идеи. Вложенные транзакции можно рассматривать как обобщение понятия точек сохранения [14.11]. Точки сохранения позволяют организовать транзакции в виде последовательности действий (а потому откат можно выполнить в любой момент до начала любого другого предыдущего действия в этой последовательности), а вложенность, наоборот, позволяет организовать транзакции в виде иерархии таких действий (рис. 14.4). Иначе говоря:

команда BEGIN TRANSACTION расширяется для поддержки подчиненных транзакций (т.е. если команда BEGIN TRANSACTION стартует тогда, когда выполняется какая-то транзакция, запускается дочерняя транзакция);

команда COMMIT фиксирует выполнение транзакции, но только в пределах родительской области видимости (если транзакция является дочерней);

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

Отметим, что вложенные транзакции в языках, подобных языку SQL, весьма не- р. 14.4. Пример построения вложен-удобны для воплощения (с синтаксиче- транзакции

ской точки зрения), так как в них имеется один серьезный недостаток- отсутствие явного оператора BEGIN TRANSACTION (необходим некоторый явный способ определения начала внутренней транзакции или точки фиксации для отката, если эта внутренняя транзакция потерпела неудачу).

а) В случае отказа системы никогда не потребуется выполнять операции REDO.

б) Физическая операция UNDO никогда не будет необходимой. Следовательно, помещать в журнал регистрации сведения об операциях UNDO также необязательно.

Это упражнение является типичным примером широкого класса приложений, для которых обычно применяется следующее решение.

EXEC SQL DECLARE CP CURSOR FOR

SELECT P.Pt, P.NAME, P.COLOR, P.WEIGHT, P.CITY




FROM P

WHERE P.P# > previous P# ORDER BY P# ; previous P# := ;

eof := false ; DO WHILE ( eof = false ) ; EXEC SQL OPEN CP ;

DO count := 1 TO 10 ;

EXEC SQL FETCH CP INTO :P#, ... ; IF SQLSTATE = 02000 THEN DO ;

EXEC SQL CLOSE CP ; EXEC SQL COMMIT ; eof := true ; END DO ; ELSE print P#, ... ; END IF ; END DO ;

EXEC SQL DELETE FROM P WHERE P.P# = :P# ; EXEC SQL CLOSE CP ; EXEC SQL COMMIT ; previous P# := P# ; END DO ;

Обратите внимание на то, что информация о позиционировании в таблице деталей Р утрачивается в конце каждой транзакции (даже если не закрывать явным образом курсор CP, оператор COMMIT закроет его автоматически). Поэтому приведенный код не будет особенно эффективным в связи с тем, что для каждой новой транзакции потребуется выполнить поиск в таблице деталей для возврата к прежней позиции. Ситуацию можно немного поправить, если использовать индекс по столбцу Pi (что обычно происходит на практике, так как {Р#} является первичным ключом) и оптимизатор выберет этот индекс в качестве пути доступа к данной таблице.



1 ... 175 176 177 [ 178 ] 179 180 181 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика