- •Глава 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-документов на основе информации из базы данных
- •Некоторые проблемы администрирования баз данных
- •Оптимизация запросов
- •Параллельная обработка данных
- •Потеря обновления
- •Зависимость от незафиксированных обновлений
- •Несогласованный анализ
- •Блокировки транзакций
- •Согласованность и уровень изоляции транзакций
- •Распределенные системы баз данных
- •Фрагментация
- •Репликация
- •Распространение обновлений
- •Управление каталогом
- •Распределенная обработка запросов
- •Типы распределенных систем баз данных
- •Нераспределенные мультибазовые субд
- •Клиент-серверные системы
- •Системы с общими ресурсами
- •Технические аспекты администрирования базы данных
- •Восстановление базы данных
- •Безопасность баз данных
- •Шифрование данных
- •Производительность баз данных
- •Администрирование данных
- •Литература
Параллельная обработка данных
Управление параллельной обработкой данных – исключительно важная задача в многопользовательской системе. Параллельная обработка базы данных заключается в предоставлении одновременного доступа к ее объектам (отношениям, кортежам, атрибутам, представлениям) многим пользователям и приложениям. В этом случае система может выполнять операции, составляющие одну транзакцию, параллельно с операциями других транзакций. Это позволит эффективнее использовать ресурсы компьютера и повысить производительность базы данных в целом.
Однако при несоблюдении определенных правил, параллельная обработка может приводить к нарушению целостности базы данных. Рассмотрим некоторые характерные проблемы, возникающие при параллельном выполнении транзакций.
Потеря обновления
Предположим, что выполняются две транзакции, Т1 и Т2, состоящие из следующих команд.
Т1: UPDATE ACCOUNTS SET BALANCE = BALANCE +100 WHERE ACCNO =1234;
Т2: UPDATE ACCOUNTS SET BALANCE = BALANCE + 200 WHERE ACCNO = 1234;
Результатом выполнения этих двух транзакций должно быть увеличение баланса счета с номером 1234 на 300 единиц. Рассмотрим, что может произойти при параллельном выполнении этих транзакций. Простая команда обновления в SQL состоит из трех операций: извлечь требуемую строку, изменить ее значение в оперативной памяти и записать измененную строку на диск. Для выполнения каждой из этих транзакций требуется отыскать строку счета 1234, найти текущее значение баланса этой строки и изменить его. При поочередном выполнении операций данных двух транзакций может возникнуть следующая ситуация:
Т1 считывает запись счета 1234. Значение баланса равно 150.
Т2 считывает запись счета 1234. Значение баланса равно 150.
Т1 увеличивает баланс счета до 250 (150 + 100).
Т2 увеличивает баланс счета до 350 (150 + 200).
Т1 заносит на диск запись с балансом 250.
Т2 заносит на диск запись с балансом 350.
Итоговое значение баланса должно равняться 450, а не 350! Обновление, выполненное транзакцией Т1, оказалось потерянным.
Зависимость от незафиксированных обновлений
Если одна транзакция выполнила обновление данных, но еще не зафиксировала его, а другая транзакция начинает использовать эти данные, то в случае отката первой транзакции окажется, что вторая будет работать с неверной информацией. Рассмотрим следующие две транзакции.
Т1: UPDATE ACCOUNTS SET BALANCE = BALANCE – 100 WHERE ACCNO =1234; IF BALANCE<0.00 THEN ROLLBACK ELSE COMMIT;
Т2: DELETE FROM ACCOUNTS WHERE BALANCE<0.00;
Первая из этих двух транзакций уменьшает баланс счета 1234 на 100. Если в результате получается отрицательный баланс, производится откат транзакции. Вторая транзакция проверяет все счета и счета с отрицательным балансом. Если вторая транзакция будет проверять счет 1234 в то время, когда с ним работает первая транзакция, может получиться следующая ситуация:
Т1 извлекает счет 1234. Значение баланса 50.
Т1 уменьшает значение баланса на 100, он становится равным –50.
Т1 заносит в базу данных запись со значением –50.
Т2 извлекает счет 1234. Баланс равен –50.
Т2 удаляет счет 1234, так как он имеет отрицательный баланс.
Т1 выполняет отмену обновления, но уже поздно – счет уже удален!
Эта ситуация называется зависимостью от незафиксированного обновления. Действия транзакции Т2 были основаны на данных, которые еще не были зафиксированы и это послужило потерей данных.