- •Часть 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.5. Тупиковая ситуация
Как было показано выше, блокировку можно использовать для разрешения трех основных проблем, возникающих при параллельной обработке кортежей. К сожалению, использование блокировок приводит к возникновению другой проблемы — тупиковой ситуации. Два примера таких ситуаций были приведены выше. На рис. 14.10 показан обобщенный пример этой проблемы, в котором p1 и p2 представляют любые блокируемые объекты, необязательно кортежи базы данных (подробнее об этом ниже в данной главе), а выражения типа "блокировка ... без взаимного доступа" представляют любые операции с наложением блокировки (без взаимного доступа), заданные как явно, так и неявно.
Счет 1 40 |
Счет 2 50 |
Счет 3 30 |
Транзакция А |
Время |
Транзакция В |
- |
/ |
- |
- |
/ |
- |
Извлечение кортежа СЧЕТ 1 : |
T1 |
- |
(задание S-блокировки для |
/ |
- |
Кортежа СЧЕТ 1) |
/ |
- |
Sum = 40 |
/ |
- |
- |
/ |
- |
Извлечение кортежа СЧЕТ 2 : |
T2 |
- |
(задание S-блокировки для |
/ |
- |
Кортежа СЧЕТ 2) |
/ |
- |
Sum = 90 |
/ |
- |
- |
/ |
- |
- |
T3 |
Извлечение кортежа СЧЕТ 3 : |
- |
/ |
(задание S-блокировки для |
- |
/ |
Кортежа СЧЕТ 3) |
- |
/ |
- |
- |
T4 |
Обновление кортежа СЧЕТ 3 |
- |
/ |
(задание X-блокировки для |
- |
/ |
Кортежа СЧЕТ 3 |
- |
/ |
30->20 |
- |
/ |
- |
- |
T5 |
Извлечение кортежа СЧЕТ 1 : |
- |
/ |
(задание S-блокировки для |
- |
/ |
Кортежа СЧЕТ 1 |
- |
/ |
- |
- |
T6 |
Обновление кортежа СЧЕТ 1 |
- |
/ |
(задание X-блокировки для |
- |
/ |
Кортежа СЧЕТ 1 |
- |
/ |
Ожидание |
Извлечение кортежа СЧЕТ 3 : |
T7 |
Ожидание |
(задание S-блокировки для |
/ |
Ожидание |
Кортежа СЧЕТ 3) |
/ |
Ожидание |
Ожидание |
/ |
Ожидание |
Ожидание |
/ |
Ожидание |
Рис. 14.9. Проблема несовместимого анализа разрешается, но в момент времени t7 возникает тупиковая ситуация
Транзакция А |
Время |
Транзакция В |
- |
/ |
- |
- |
/ |
- |
Блокировка p1 без взаимного |
T1 |
- |
Доступа |
/ |
- |
- |
/ |
- |
- |
T2 |
Блокировка p2 без взаимного |
- |
/ |
Доступа |
- |
/ |
- |
Блокировка p2 без взаимного |
T3 |
- |
Доступа |
/ |
- |
Ожидание |
/ |
- |
Ожидание |
T4 |
Блокировка p1 без взаимного |
Ожидание |
/ |
Доступа |
Ожидание |
/ |
Ожидание |
Ожидание |
/ |
Ожидание |
Рис. 14.10. Пример тупиковой ситуации
Тупиковая ситуация возникает тогда, когда две или более транзакции одновременно находятся в состоянии ожидания, причем для продолжения работы каждая из транзакций ожидает прекращения выполнения другой транзакции. На рис. 14.10 показана тупиковая ситуация, включающая две транзакции, однако в принципе возможны тупиковые ситуации с участием трех, четырех и более транзакций. Однако эксперименты с системой System R показали, что на практике никогда не встречаются тупиковые ситуации с участием более чем двух транзакций [14.4].
Желательно, чтобы при возникновении тупиковой ситуации система могла обнаружить ее и найти из нее выход. Для обнаружения тупиковой ситуации следует обнаружить цикл в диаграмме состояний ожидания, т.е. в перечне "транзакций, которые ожидают окончания выполнения других транзакций". Поиск выхода из тупиковой ситуации состоит в выборе одной из заблокированных транзакций в качестве жертвы и отмене ее выполнения. Таким образом, с нее снимается блокировка, а выполнение другой транзакции может быть возобновлено.
Замечание. На практике не все системы в состоянии обнаружить тупиковую ситуацию. Например, в некоторых из них используется хронометраж выполнения транзакций, и сообщение о возникновении тупиковой ситуации поступает, если транзакция не выполняется за некоторое предписанное заранее время.
Обратите внимание, что транзакция-жертва признается "некорректной" и отменяется "не из-за собственной некорректности". В некоторых системах предусмотрен автоматический перезапуск транзакции с самого начала при условии, что обстоятельства, которые привели к тупиковой ситуации, не повторятся вновь. А в других системах в программу, связанную с данной транзакцией, просто посылается сообщение о "вызвавшей тупиковую ситуацию транзакции-жертве" для обработки этой ситуации в самой программе. С точки зрения программирования приложений предпочтительнее первый из этих подходов. Но несмотря на это, всегда рекомендуется решать данную проблему с точки зрения пользователя.