- •Глава 13. Семантическое моделирование
- •Часть III Проектирование базы данных
- •Часть IV
- •14.1. Введение
- •14.2. Транзакции
- •14.3. Восстановление транзакции
- •14.4. Восстановление системы
- •14.5. Восстановление носителей
- •14.6. Двухфазная фиксация
- •14.7. Поддержка языка sql
- •14.8. Резюме
- •15.1. Введение
- •15.2. Три проблемы параллельности
- •15.3. Блокировка
- •15.4. Устранение трех проблем параллельности
- •15.5. Взаимная блокировка
- •15.6. Упорядочиваемость
- •15.7. Уровни изоляции
- •15.8. Блокировка намерения
- •15.9. Средства языка sql
- •15.10. Резюме
- •Часть V
- •16.1. Введение
- •16.2. Избирательная схема управления доступом
- •16.3. Мандатная схема управления доступом
- •16.4. Статистические базы данных
- •16.5. Шифрование данных
- •16.6. Средства языка sql
- •16.7. Резюме
- •17.1. Введение
- •17.2. Пример выполнения оптимизации
- •17.3. Оптимизация запросов
- •17.4. Преобразование выражений
- •17.5. Статистические показатели базы данных
- •17.6. Стратегия по принципу "разделяй и властвуй"
- •17.7. Реализация реляционных операторов
- •17.8. Резюме
- •18.1. Введение
- •18.2. Обзор концепции трехзначной логики
- •18.3. Некоторые следствия изложенной схемы
- •18.4. Отсутствующие значения и ключи
- •18.5. Внешнее соединение
- •18.6. Специальные значения
- •18.7. Поддержка неопределенных значений в языке sql
- •18.8. Резюме
- •Глава 19
- •19.1. Введение
- •19.2. Иерархия типов
- •19.3. Полиморфизм и заменимость
- •19.4. Переменные и операция присвоения
- •19.5. Специализация по ограничениям
- •19.6. Операции сравнения
- •19.7. Операторы, версии и сигнатуры
- •19.8. Является ли окружность эллипсом
- •19.9. Пересмотр специализации ограничением
- •19.10. Резюме
- •20.1. Введение
- •20.2. Предварительные сведения
- •20.3. Двенадцать основных целей
- •1. Локальная независимость
- •2. Отсутствие опоры на центральный узел
- •3. Непрерывное функционирование
- •4. Независимость от расположения
- •5. Независимость от фрагментации
- •6. Независимость от репликации
- •7. Обработка распределенных запросов
- •8. Управление распределенными транзакциями
- •9. Аппаратная независимость
- •10. Независимость от операционной системы
- •11. Независимость от сети
- •12. Независимость от типа субд
- •20.4. Проблемы распределенных систем
- •Транзакция т1х
- •20.5. Системы "клиент/сервер"
- •20.6. Независимость от субд
15.2. Три проблемы параллельности
Прежде всего следует рассмотреть проблемы, которые обязательно должны устра- няться любым из предлагаемых методов управления параллельностью. При обработке транзакций в общем случае возможны три типа ситуаций, при которых параллельное вы- полнение транзакций, каждая из которых сама по себе является корректной, из-за взаим- ных помех способно привести к неправильному результату. Обратите внимание, что вно- сящая помеху транзакция сама по себе может быть вполне корректной, а неправильный конечный результат возникает из-за бесконтрольного чередования операций двух пра- вильных транзакций. (Выражение "правильная транзакция" здесь означает, что эта тран- закция не нарушает золотое правило, описанное в главе 8.) Ниже приводятся три про- блемы, возникающие при параллельной обработке транзакций.
Потеря результатов обновления
Зависимость от незафиксированных результатов
Несогласованная обработка данных
Проблема потери результатов обновления
Рассмотрим ситуацию, показанную на рис. 15.1. Здесь транзакция А считывает неко- торый кортеж t в момент tl, а транзакция В считывает этот же кортеж t в момент t2. Далее транзакция А обновляет кортеж t в момент t3 (исходя из значений, считанных в момент tl), а транзакция В обновляет тот же кортеж t в момент t4 (исходя из значений, считанных в момент t2 и аналогичных значениями, которые были считаны в момент tl). Можно видеть, что результат операции обновления, выполненной транзакцией А, будет утерян, поскольку в момент t4 он будет перезаписан в результате операции обновления, выполняемой транзакцией В.
Замечание. Здесь и далее в этой главе вновь делается допущение, что имеет смысл говорить об "обновлении кортежа".
Проблема зависимости от незафиксированных результатов
Проблема зависимости от незафиксированных результатов может возникнуть в том случае, если любой транзакции разрешено считывание (или, что еще хуже, обновление) кортежа, который только что был обновлен другой транзакцией, но результаты выполне-
ния этой транзакции еще не были зафиксированы. Если некоторое обновление не зафик- сировано, всегда существует определенная вероятность, что оно не будет зафиксировано никогда из-за отката данной транзакции. В этом случае первая транзакция будет обраба- тывать данные, которые уже не существуют (и, в сущности, никогда не существовали). Данная ситуация представлена на рис. 15.2 и 15.3.
Транзакция А |
Время |
Транзакция В |
Извлечение кортежа t |
1 tl 1 |
— |
— |
1 t2 1 |
Извлечение кортежа t |
Обновление кортежа t |
I t3 I |
— |
— |
1 t4 i |
Обновление кортежа р |
Рис. 15.1. Потеря в момент |
t4 результатов обновления, выполненного транзакцией А | |
Транзакция А |
Время |
Транзакция В |
— |
tl |
Обновление кортежа t |
Извлечение кортежа t |
t2 1 |
— |
— |
1 t3 i |
Отмена выполнения транзакции |
Рис. 15.2. В момент t2 транзакция А оказывается зависимой от незафиксированных ре- зультатов обновления | ||
Транзакция А |
Время |
Транзакция В |
— |
1 tl 1 |
Обновление кортежа t |
Обновление кортежа t |
1 t2 |
— |
— |
t3 i |
Отмена выполнения транзакции |
Рис. 15.3. Транзакция А обновляет незафиксированное изменение в момент Ь2, но ре- зультаты этого обновления утрачиваются в момент ЬЗ
В первом примере (см. рис. 15.2) транзакция А в момент t2 получает доступ к неза- фиксированным результатам обновления (иногда называемым незафиксированным из- менением). Затем это обновление в момент t3 отменяется. В результате транзакция А вы- полняется, исходя из ошибочного предположения, что кортеж t имеет значение, которое он имел в момент t2, тогда как на самом деле он сохранил свое прежнее значение, кото- рое имел в момент tl. В итоге в результате выполнения транзакции А будет получен не-
верный результат. Кроме того, следует учитывать, что откат транзакции В может про- изойти не по вине транзакции В, а, например, в результате сбоя системы. (К этому вре- мени выполнение транзакции А может быть уже завершено, а потому сбой системы не приведет к откату транзакции А.)
Второй пример, приведенный на рис. 15.3, иллюстрирует еще более неприятный случай. В момент t2 транзакция А вновь оказывается зависимой от незафиксированно- го изменения. Более того, в момент t3 все ее результаты фактически утрачиваются, поскольку откат транзакции В приводит к восстановлению исходного состояния кор- тежа t, которое он имел в момент tl. Это еще один вариант проблемы потери резуль- татов обновления.
Проблема несогласованной обработки данных
На рис. 15.4 показаны транзакции А и В, которые обрабатывают кортежи, содержа- щие сведения об остатках на счетах (АСС). При этом транзакция А суммирует текущие остатки на счетах, а транзакция В выполняет перевод суммы в $10 со счета 3 на счет 1. Полученный в итоге выполнения транзакции А результат $110, очевидно, неверен, и если он будет помещен в базу данных, то она окажется в противоречивом состоянии'. В таком случае говорят, что транзакция А выполняет несогласованную обработку дан- ных, в результате чего получается противоречивый результат. Обратите внимание на следующее отличие этого примера от предыдущего: здесь не идет речь о зависимости транзакции А от незафиксированных результатов транзакции В, так как последняя вы- полнила и зафиксировала все свои обновления до того, как транзакция А считала зна- чение остатка для счета АСС 3.