- •Глава 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.9. Средства языка sql
В стандарте языка SQL не предусмотрена явная поддержка каких-либо функций блоки- ровки (фактически понятие блокировки в нем вообще не упоминается). Однако реализация подобных средств необходима для получения гарантий исключения конфликтных ситуаций между транзакциями, выполняющимися параллельно. Точнее говоря, требуется, чтобы об- новления, выполняемые некоторой транзакцией Т1, не были доступны любой другой транзак- ции Т2 до тех и обязательно до тех пор, пока не будет завершено выполнение транзакции Т1. Фиксация транзакции открывает доступ ко всем обновлениям, выполненным данной транзак- цией. Откат транзакции приводит к тому, что все выполненные ею обновления отменяются.
Замечание. Сказанное выше относится к случаю, когда все транзакции выполняются на уровне изоляции READ COMMITTED (чтение зафиксированного), REPEATABLE READ (повторяемое чтение) и SERIALIZABLE (упорядочиваемость). К транзакциям, выполняе- мым на уровне изоляции READ UNCOMMITTED (чтение незафиксированного), применяются особые соглашения, допускающие "некорректное чтение" (об этом речь идет ниже), но только в режиме READ ONLY (только чтение); подробности приводятся в главе 14.
Уровни изоляции
6
В данном случае ключевое слово
SERIALIZABLE
является
не совсем удачным, поскольку
этот
термин подразумевает упорядочиваемость
графиков
запуска, а
не транзакций.
Более
удач-
ным был бы вариант TWO
PHASE, который
означает выполнение транзакции
(возможно, прину-
дительное) в
соответствии с требованиями протокола
двухфазной блокировки.
Если все транзакции выполняются на уровне изоляции SEEIALIZABLE (принимаемом по умолчанию), то график выполнения любого множества параллельных транзакций с чередованием их операций будет гарантированно упорядоченным. Однако если некото- рая транзакция выполняется на более низком уровне изоляции, то упорядоченность гра- фика может быть нарушена самыми разными способами. В данном стандарте указаны три особых случая нарушения упорядочиваемости.
Некорректное чтение. Допустим, что транзакция Т1 обновила данные в некото- рой строке, затем транзакция Т2 считала эту строку, после чего был выполнен от- кат транзакции Т1. В результате транзакция Т2 будет работать с данными, которые больше не существуют и в определенном смысле никогда не существовали (поскольку в действительности транзакция Т1 так и не была выполнена).
Неповторяемое чтение. Допустим, что транзакция Т1 считывает некоторую стро- ку, затем транзакция Т2 ее обновляет, после чего транзакция Т1 вновь считывает эту же строку. В результате транзакция Т1 считает два совершенно разных значе- ния одной и той же строки.
Чтение фантомов. Допустим, что транзакция Т1 считывает множество всех строк, удовлетворяющих некоторому заданному условию (например, строки всех поставщиков из Парижа). Допустим также, что транзакция Т2 вставляет в таблицу новую строку, которая удовлетворяет этому же условию. Если транзакция Tl вновь повторит ту же операцию выборки, что и раньше, то ею будет обнаружена ранее отсутствовавшая строка — "фантом" (phantom).
Различные уровни изоляции определяются в терминах приведенных выше случаев нарушения упорядоченности. Соответствующие определения схематически представле- ны на рис. 15.13.
Уровень изоляции |
Некорректное чтение |
Неповторяемое чтение |
Чтение фантомов |
READ UNCOMMITTED |
Y |
Y |
Y |
READ COMMITTED |
N |
Y |
Y |
REPEATABLE READ |
N |
N |
Y |
SERIALIZABLE |
N |
N |
N |
Рис. 15.13. Уровни изоляции языка SQL
Возникает очевидный вопрос: "Каким же образом система сможет предотвратить по- явление фантомов?". Для этого в ней должна быть предусмотрена блокировка пути дос- тупа к данным. Если в приведенном выше примере с поставщиками из Парижа путем доступа к данным служит индекс по городам поставщиков, то система должна будет за- блокировать строку этого индекса, относящуюся к Парижу. Благодаря такой блокировке фантомы возникнуть не смогут, поскольку для их появления потребуется обратиться к данному пути доступа (т.е. в приведенном примере — к конкретному значению индекса). Более подробно этот вопрос рассматривается в [14.12].
В заключение следует повторить, что определения уровня изоляции REPEATABLE READ в стандарте языка SQL и в СУБД DB2 являются совершенно разными. На самом деле уровню REPEATABLE READ в СУБД DB2 соответствует уровень SERIALIZABLE в стандарте языка SQL.