
- •Часть IV
- •Глава 13 Восстановление
- •13.1. Введение
- •13.2. Транзакции
- •13.3. Восстановление транзакции
- •13.4. Восстановление системы
- •13.5. Восстановление носителей
- •13.6. Двухфазная фиксация
- •13.7. Поддержка языка sql
- •13.8. Резюме
- •Глава 14 Параллелизм
- •14.1. Введение
- •14.2. Три проблемы параллелизма
- •14.3. Блокировка
- •14.4. Решение проблем параллелизма
- •14.5. Тупиковая ситуация
- •14.6. Способность к упорядочению
- •14.7. Уровни изоляции
- •14.8. Преднамеренная блокировка
- •IX s
- •14.9. Поддержка блокировок в sql
- •14.10. Резюме
- •14.13. Papadimitriou с. The Theory of Database Concurrency Control.— Rockville, Md.: Computer Science Press, 1986.
- •Глава 15 Безопасность
- •15.1. Введение
- •15.2. Общие соображения
- •15.3. Избирательное управление доступом
- •15.4. Модификация запроса
- •15.5. Обязательное управление доступом
- •15.6. Шифрование данных
- •Стандарт шифрования данных
- •15.7. Поддержка мер обеспечения безопасности в языке sql
- •15.8. Резюме
14.13. Papadimitriou с. The Theory of Database Concurrency Control.— Rockville, Md.: Computer Science Press, 1986.
Учебное пособие, в котором особое внимание уделяется формальной теории.
Ответы к некоторым упражнениям
14.3. а) Существует три корректных результата, соответствующих шести возможным последовательным графикам запуска:
Начальное значение : А = О
Т1-Т2-ТЗ : А = 1
Т1-ТЗ-Т2 : А = 2
Т2-Т1-ТЗ : А = 1
Т2-ТЗ-Т1 : А = 2
ТЗ-Т1-Т2 : А = 4
ТЗ-Т2-Т1 : А = 3
Конечно, не все шесть полученных результатов отличаются. Фактически, в данном примере так получилось потому, что благодаря смыслу транзакции ТЗ возможные правильные результаты независимы от начального состояния базы данных.
б) Существует 90 возможных различных графиков запуска, которые можно представить в приведенном ниже символическом виде. (Здесь Ri, Rj, Rk обозначают операции извлечения R1, R2, R3, причем не обязательно в той же последовательности. Аналогично, Up, Uq, Ur обозначают операции обновления U7, U2, U3, также не обязательно в той же последовательности.)
Ri-Rj-Rk-Up-Uq-Ur : 3*2*1*3*2*1= 36 вариантов
Ri-Rj-Up-Rk-Uq-Ur : 3*2*2*1*2*1= 24 вариантов
Ri-Rj-Up-Uq-Rk-Ur : 3*2*2*1*1*1=12 вариантов
Ri-Up-Rj-Rk-Uq-Ur : 3*1*2*1*2*1= =12 вариантов
Ri-Up-Rj-Uq-Rk-Ur : 3*1*2*1*1*1= 6 вариантов
Всего = 90 вариантов
в) Да. Например, график запуска R1-R2-R3-U3-U2-U1 приводит к тому же результату (единица) для заданного начального значения (нуль), как и два из шести возможных последовательных графиков запуска. (Упражнение. Проверьте это утверждение.) Однако следует понимать, что "корректность" полученного результата является всего лишь счастливой случайностью и следствием того, что исходное значение было равно 0, а не какому-то другому значению. В качестве примера обратной ситуации рассмотрите случай, в котором исходное значение равно 10. Будет ли показанный выше график запуска приводить к одному из действительно корректных результатов? (Какие в этом случае будут действительно корректные результаты?) Если нет, то график запуска R1-R2-R3-U3-U2-U1 не допускает упорядочения.
г) Да. Например, график запуска R1-R3-U1-U3-R2-U2 допускает упорядочение (он эквивалентен последовательному графику запуска Т1-Т2-ТЗ), но не может быть получен, если T1, T2 и T3 подчиняются двухфазному протоколу блокировки. В таком случае для выполнения операции R3 потребуется с согласия транзакции ТЗ задать S-блокировку для А. Тогда операция U1 в транзакции T1 не будет выполняться до тех пор, пока не будет снята блокировка, а это не произойдет до завершения выполнения транзакции ТЗ (действительно, при достижении операции U3 транзакции ТЗ и T1 попадут в тупиковую ситуацию).
Это упражнение прекрасно иллюстрирует следующий очень важный момент. Пусть для данного набора транзакций и начального состояния базы данных задано множество всех возможных графиков запуска (ВСЕ), содержащих эти транзакции, множество всех графиков запуска (ПРАВИЛЬНЫЕ), которые гарантированно приводят к корректному финальному состоянию или, по крайней мере, могут привести к нему для некоторого начального состояния, множество всех способных к упорядочению графиков запуска (ДОПУСКАЮЩИЕ УПОРЯДОЧЕНИЕ), а также множество всех графиков запуска (РЕЗУЛЬТАТИВНЫЕ), которые приводят к корректному результату согласно двухфазному протоколу блокировки. Тогда вообще будет верно следующее утверждение (здесь знак "<=' обозначает "подмножество"):
РЕЗУЛЬТАТИВНЫЕ <= ДОПУСКАЮЩИЕ УПОРЯДОЧЕНИЕ <= ПРАВИЛЬНЫЕ <= ВСЕ
14.4. В момент времени tn ни одна из транзакций вовсе не выполнит никакой полезной работы! Дело в том, что будет существовать одна тупиковая ситуация, включающая транзакции T2,T2,T9 и Т8. Кроме того, транзакция Т4 находится в состоянии ожидания (ожидает) завершения выполнения транзакции Т9, транзакция 772 ожидает завершения выполнения транзакции Т4, а транзакции Т10 и T11 ожидают завершения выполнения транзакции T2. Эту ситуацию можно представить с помощью приведенной на рис. 14.14 диаграммы состояний ожидания, в которой узлы представляют собой транзакции, а стрелка от узла Ti к узлу Tj указывает на то, что транзакция Ti находится в состоянии ожидания завершения выполнения транзакции Тj. Возле стрелок размещены названия объектов базы данных с указанием в скобках уровня блокировки, на котором они находятся в состоянии ожидания.
T10 T11
A
( X ) C ( X )
T12
D
( X )
T4
G
( S )
H ( X )
T9
T8
G ( S ) E ( S )
T3
T2
F ( X )
Рис. 14.14. Диаграмма состояний ожидания для упр. 14.4
14.5. Для задач, приведенных на рис. 14.1-14.3, уровень изоляции стабильности курсора обладает тем же эффектом, что и уровень повторяемого считывания (обратите внимание, однако, что для системы DB2 это утверждение не применимо к уровню стабильности курсора из-за того, что в системе DB2 вместо S-блокировок используются U-блокировки). Что касается проблемы несовместимого анализа (см. рис. 14.4), то уровень изоляции стабильности курсора не позволяет разрешить эту проблему. Дело в том, что транзакция А должна выполняться на уровне повторяемости считывания для того, чтобы сохранить все блокировки до завершения выполнения транзакции, иначе будет получен неверный результат. (Конечно, если система поддерживает такой режим, то в качестве альтернативного варианта можно было бы с помощью транзакции А полностью заблокировать все отношение счетов с помощью некоторой явно заданной блокировки. Это решение можно было бы использовать для уровней изоляции стабильности курсора и повторяемости считывания.)
14.9. В этой главе были рассмотрены три проблемы параллелизма, а именно: проблемы потери результатов обновления, незафиксированной зависимости и несовместимого анализа.
• Потеря результатов обновления. Согласно стандарту языка SQL требуется, чтобы (при любых обстоятельствах) никогда не возникала проблема потери результатов обновления.
• Незафиксированная зависимость. Это всего лишь иное название проблемы неаккуратного считывания.
• Несовместимый анализ. Этим термином обозначаются как проблема неповторяемого считывания, так и проблема фиктивных элементов.