- •Глава 1. Базы данных и системы управления 9
- •Глава 2. Организация доступа к данным 45
- •Глава 3. Реляционная алгебра 60
- •Глава 4. Основы sql 67
- •Глава 5. Проектирование реляционных баз данных 89
- •Глава 6. Взаимодействие sql с приложениями 116
- •Глава 7. Некоторые проблемы администрирования баз данных 154
- •Базы данных и системы управления
- •Файловые системы
- •Концепция баз данных
- •Основные функции субд
- •Непосредственное управление данными во внешней памяти
- •Управление буферами оперативной памяти
- •Управление транзакциями
- •Журнализация
- •Поддержка языков баз данных
- •Трехуровневая модель архитектуры систем баз данных
- •Модели данных
- •Характеристика связей
- •Компьютерно-ориентированные модели данных
- •Реляционный подход
- •Ключи и целостность реляционных данных
- •Моделирование концептуальной схемы базы данных
- •Организация доступа к данным
- •Страницы и файлы
- •Индексирование
- •Структуры типа б-дерева
- •Хеширование
- •Методы сжатия
- •Метод дифференциального сжатия
- •Иерархические методы сжатия
- •Кодирование по методу Хаффмена
- •Реляционная алгебра
- •Традиционные реляционные операции
- •Специальные реляционные операции
- •Дополнительные реляционные операции
- •Примеры использования реляционной алгебры для выражения словесных запросов в виде формул
- •Основы sql
- •Типы данных
- •Строковые типы данных
- •Битовые типы данных
- •Точные числовые типы данных
- •Вещественные числовые типы данных
- •Календарные типы данных
- •Значения null
- •Создание и обслуживание таблиц
- •Запрос на выборку
- •Статистические функции
- •Создание соединений
- •Вложенные запросы
- •Запрос на объединение
- •Запросы, выполняющие реляционные операции вычитания, пересечения и деления
- •Запросы на изменение
- •Перекрестные запросы
- •Проектирование реляционных баз данных
- •Нормализация отношений
- •Функциональные зависимости
- •Н ормальные формы, обоснованные функциональными зависимостями
- •Нормальная форма Бойса–Кодда
- •Нормальные формы, обоснованные более сложными зависимостями
- •Процедура нормализации и проектирования
- •Пример проектирования базы данных
- •Назначение и предметная область
- •Проектирование базы данных
- •Взаимодействие sql с приложениями
- •Встраивание sql-операторов в программный код
- •Тип курсора
- •Триггеры
- •Хранимые процедуры
- •Стандартные интерфейсы для доступа к данным
- •Информационное окружение веб-сервера
- •Стандарт odbc
- •Уровни соответствия
- •Уровень соответствия odbc
- •Задание имени источника данных odbc
- •Расширяемый язык разметки xml
- •Xml как язык разметки
- •Материализация хмl-документов с помощью xslt
- •Создание хмl-документов на основе информации из базы данных
- •Некоторые проблемы администрирования баз данных
- •Оптимизация запросов
- •Параллельная обработка данных
- •Потеря обновления
- •Зависимость от незафиксированных обновлений
- •Несогласованный анализ
- •Блокировки транзакций
- •Согласованность и уровень изоляции транзакций
- •Распределенные системы баз данных
- •Фрагментация
- •Репликация
- •Распространение обновлений
- •Управление каталогом
- •Распределенная обработка запросов
- •Типы распределенных систем баз данных
- •Нераспределенные мультибазовые субд
- •Клиент-серверные системы
- •Системы с общими ресурсами
- •Технические аспекты администрирования базы данных
- •Восстановление базы данных
- •Безопасность баз данных
- •Шифрование данных
- •Производительность баз данных
- •Администрирование данных
- •Литература
Согласованность и уровень изоляции транзакций
В первой главе рассматривались свойства транзакций – атомарность, согласованность, изолированность и устойчивость. Свойства атомарности и устойчивости не вызывают сложностей с пониманием. Свойства согласованности и изолированности не являются такими же определенными.
Рассмотрим команду на обновление:
UPDATE Поставщики SET Статус := 50 WHERE Гор = ‘Брест’;
Предположим, что в таблице Поставщики имеется 500 строк, и в 50 из них атрибут Гор имеет значение ‘Брест’. Чтобы найти псе эти 50 строк, СУБД потребуется некоторое время. Будет ли на протяжении этого времени разрешено другим транзакциям обновлять поля Гор и Статус в этой таблице? Если SQL-команда является согласованной, то такие обновления будут запрещены. Обновление будет применено к набору строк в том виде, в каком они существовали в момент запуска SQL-команды. Такая согласованность называется согласованностью на уровне команды (statement level consistency).
Теперь рассмотрим транзакцию, которая содержит два оператора обновления:
BEGIN TRANSACTION UPDATE Поставщики SET Статус := 50 WHERE Гор = ‘Брест’ UPDATE Поставщики SET Имя_П :='Имя_П'’-Брест’ WHERE Статус = 50;
Согласованность на уровне оператора означает, что каждый из двух операторов обрабатывает строки согласованно, но в интервале между ними указанные строки могут изменяться другими пользователями. Согласованность на уровне транзакции (transaction level consistency) означает, что все строки, затронутые любым из SQL-операторов, защищены от изменений на протяжении всей транзакции.
Согласованность на уровне транзакции является сильным ограничением. Транзакция может не видеть свои же собственные изменения. В данном примере второй оператор не будет видеть строк, измененных первым оператором.
Еще более сложной является ситуация с термином изолированность.
Блокировки предотвращают потерю изменений при параллельной обработке. Тем не менее, существует ряд проблем, которые они предотвратить не в состоянии. Перечислим такие проблемы.
Грязное чтение (dirty read) – чтение транзакцией записи, которая изменена, но еще не записана в базу данных. Это может произойти, например, когда одна транзакция считывает строку, измененную другой незавершенной транзакцией, а эта другая транзакция впоследствии отменяется.
Невоспроизводимое чтение (nonrepeatable reads) – это ситуация, когда при повторном чтении данных, уже считанных ранее, транзакция обнаруживает модификации или удаления, вызванные другой завершенной транзакцией.
Фантомное чтение (phantom reads) – это ситуация, когда при повторном чтении данных транзакция обнаруживает новые строки, вставленные другой завершенной транзакцией после предыдущего чтения.
В стандарте SQL 1992 года определены четыре уровня изоляции транзакций, которые определяют допустимость перечисленных выше проблем. Цель состоит в том, чтобы разработчик прикладной программы мог указать желаемый уровень изоляции, а СУБД осуществляла управление блокировками в соответствии с этим указанием.
Уровень изоляции «незавершенное чтение» (read uncommited) допускает грязное чтение, невоспроизводимое чтение и фантомное чтение. Уровень изоляции «завершенное чтение» (read committed) предотвращает грязное чтение и разрешает невоспроизводимое чтение и фантомное чтение. Уровень изоляции «воспроизводимое чтение» (repeatable read) предотвращает «грязное» чтение и невоспроизводимое чтение и разрешает только фантомное чтение. Уровень изоляции «сериализуемостъ» (serializable) не допускает возникновения ни одной из этих трех проблем.