
- •Письменные лекции по дисциплине «Базы данных»
- •Лекция 1. Понятие субд. Модели данных. Реляционная модель
- •1.1. Бд и субд
- •1.2. Классификация бд
- •1.3. Классификация субд
- •1.3.1. Состав субд и работа бд
- •1.4. Язык sql
- •1.5. Основные типы sql запросов по их видам
- •1.6. Основные функции субд
- •1.7. Модели данных
- •1.8. Реляционная модель данных
- •1.9. Информационный объект
- •1.10. Нормализация отношений
- •1.10.1. Первая нормальная форма
- •1.10.2. Вторая нормальная форма
- •Лекция 2. Продолжение прошлой лекции
- •2.1. Третья нормальная форма
- •2.2. Отношения
- •2.3. Ключ
- •2.4. Пример выгрузки данных
- •2.5. Заполнение таблиц
- •2.6. Реляционные операции
- •1. Выборка
- •2. Проекция
- •3. Объединение
- •4. Пересечение
- •5. Разность
- •6. Произведение
- •7. Деление
- •8. Соединение
- •2.7. Соединение таблиц
- •2.8. Изменение таблицы
- •2.9. Типы данных MySql
- •2.10. Параллелизм
- •Лекция 3. Хранимые процедуры и функции
- •3.1. Хранимая процедура MySql
- •3.2. Переменные
- •3.3. Параметры процедуры
- •3.4. Операторы if и case
- •3.5. Оператор return
- •Лекция 4. Транзакции. Уровни изоляции. Блокировки.
- •4.1. Понятие транзакции
- •4.2. Операторы транзакции
- •4.3. Уровни изоляции (изолированности) транзакций
- •4.4. Тест acid
- •4.5. Механизм блокировок
- •4.6. Взаимоблокировки
- •4.7. Ведение журнала транзакций
- •Лекция 5. Ссылочная целостность данных. Внешние ключи. Индексирование.
- •5.1. Ссылочная целостность данных
- •5.2. Внешний ключ
- •5.2.1. Условия обеспечения целостности данных при помощи внешнего ключа
- •5.2.2. Практический пример
- •5.2.3. Синтаксис объявления внешнего ключа
- •5.3. Индекс
- •5.3.1. Для каких полей нужно создавать индексы
- •5.3.2. Принцип работы индексов
- •5.3.3. Виды индексов
- •5.3.4. Индексирование таблиц MySql
- •5.3.5. Создание индекса в MySql
- •5.3.6. Типы индексов в MySql
- •5.3.7. Удаление индекса в MySql
- •5.3.8. Преимущества использования индексов
- •5.3.9. Недостатки использования индексов
- •5.3.10. Практический пример
- •5.4. Курсор
- •Лекция 6. Администрирование баз данных
- •6.1. Резервирование и восстановление вручную
- •6.2. Команды grant и revoke
- •6.3. Утилита mysqldump
- •6.3.1. Создание дампа
- •6.3.2. Развертывание дампа
- •6.4. Утилита mysqlhotcopy
- •6.5. Утилита mysqlcheck
- •Лекция 7. Администрирование бд
- •7.7. Статус таблиц
- •7.8. Просмотр таблиц, доступных в бд
- •7.9. Получение информации о статусе сервера
- •7.10. Получение информации о переменных
- •7.16. Файлы журналов
- •7.17. Как обезопасить MySql от хакеров
- •Указатели на страницы с ответами
4.6. Взаимоблокировки
Взаимоблокировка возникает тогда, когда две и более транзакции взаимно удерживают и запрашивают блокировку одних и тех же ресурсов, создавая циклическую зависимость. Такие состояния наблюдаются и в том случае, если транзакции пытаются заблокировать ресурсы в разном порядке. Они могут возникнуть, когда несколько транзакций блокируют одни и те же ресурсы. Для примера рассмотрим две транзакции, обращающиеся к таблице StockPrice:
Транзакция №1
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = '2002-05-01';
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = '2002-05-02';
COMMIT;
Транзакция №2
START TRANSACTION;
UPDATE StockPrice SET high = 20.12 WHERE stock_id = 3 and date = '2002-05-02';
UPDATE StockPrice SET high = 47.20 WHERE stock_id = 4 and date = '2002-05-01';
COMMIT;
Если вам не повезет, то каждая транзакция выполнит свой первый запрос и обновит строку данных, заблокировав ее. Затем все транзакции попытаются обновить вторую строку, но обнаружат, что та уже заблокирована. В итоге каждая транзакция будет до бесконечности ожидать окончания другой, пока не произойдет вмешательство извне, которое снимет взаимоблокировку.
Для борьбы с этой проблемой в СУБД реализованы различные формы обнаружения взаимоблокировок и тайм-аутов. Более совершенные подсистемы хранения данных, такие как InnoDB, легко обнаруживают циклические зависимости и немедленно возвращают ошибку. Это очень хорошо, иначе взаимоблокировки проявлялись бы в виде очень медленных запросов. Другие системы откатывают транзакцию по истечении тайм-аута, что не очень хорошо. InnoDB обрабатывает взаимоблокировки откатом той транзакции, которая захватила меньше всего монопольных блокировок строк (приблизительный показатель легкости отката).
Поведение и порядок блокировок зависят от подсистемы хранения данных, так что в одних подсистемах при определенной последовательности команд могут происходить взаимоблокировки, а в других — нет. Взаимоблокировки имеют двойственную природу: некоторые неизбежны из-за конфликта данных, другие вызваны схемой работы конкретной подсистемы хранения.
Нельзя справиться с взаимоблокировками без отката одной из транзакций, частичного либо полного. Такова суровая правда жизни в транзакционных системах, и это надо учитывать при проектировании приложений. Многие приложения могут просто попытаться выполнить транзакцию с самого начала.
4.7. Ведение журнала транзакций
Ведение журнала помогает сделать транзакции более эффективными. Вместо обновления таблиц на диске после каждого изменения подсистема хранения данных может изменить находящуюся в памяти копию данных. Это происходит очень быстро. Затем подсистема хранения запишет сведения об изменениях в журнал транзакции, который хранится на диске и поэтому долговечен. Это тоже довольно быстрая операция, поскольку добавление событий в журнал сводится к операции последовательного ввода/вывода в пределах ограниченной области диска вместо случайного ввода/вывода в разных местах. Позже процесс обновит таблицу на диске. Таким образом, большинство подсистем хранения данных, которые используют этот метод (упреждающую запись в журнал), дважды сохраняют изменения на диске.
Если сбой произойдет после внесения записи в журнал транзакции, но до обновления самих данных, подсистема хранения может восстановить изменения после перезагрузки сервера. Методы восстановления у каждой подсистемы хранения данных различны.