
- •Потенциальные ключи
- •Целостность сущностей
- •Внешние ключи
- •Целостность внешних ключей
- •Стратегии поддержания ссылочной целостности
- •Синтаксис соединенных таблиц
- •Синтаксис условных выражений раздела where
- •Алгоритм нормализации (приведение к 3нф)
- •Работа транзакций в смеси
- •Проблемы параллельной работы транзакций
- •Проблема потери результатов обновления
- •Проблема незафиксированной зависимости (чтение "грязных" данных, неаккуратное считывание)
- •Неповторяемое считывание
- •Фиктивные элементы (фантомы)
- •Собственно несовместимый анализ
- •Блокировки
- •Преднамеренные блокировки
- •Метод временных меток
- •Механизм выделения версий данных
- •Уровни изоляции
- •Синтаксис операторов sql, определяющих уровни изоляции
- •Виды восстановления данных
- •Индивидуальный откат транзакции
- •Восстановление после жесткого сбоя
- •Восстановление после мягкого сбоя
- •Построение
- •Свойства
Работа транзакций в смеси
Транзакция рассматривается как последовательность элементарных атомарных операций. Атомарность отдельной элементарной операции состоит в том, что СУБД гарантирует, что, с точки зрения пользователя, будут выполнены два условия:
Эта операция будет выполнена целиком или не выполнена вовсе (атомарность - все или ничего).
Во время выполнения этой операции не выполняются никакие другие операции других транзакций (строгая очередность элементарных операций).
Например, элементарными операциями транзакции будут считывание страницы данных с диска или запись страницы данных на диск (страница данных - это минимальная единица для дисковых операций СУБД). Условие 2 на самом деле является именно логическим условием, т.к. реально система может выполнять несколько различных элементарных операций в один и тот же момент. Например, данные могут храниться на нескольких физически различных дисках и операции чтения-записи на эти диски могут выполняться одновременно.
Элементарные операции различных транзакций могут выполняться в произвольной очередности (конечно, внутри каждой транзакции последовательность элементарных операций этой транзакции является строго определенной). Например, если есть несколько транзакций, состоящих из последовательности операций элементарных:
,
,
то реальная последовательность, в которой СУБД выполняет эти транзакции может быть, например, такой:
.
Определение 1. Набор из нескольких транзакций, элементарные операции которых чередуются друг с другом, называется смесью транзакций.
Определение 2. Последовательность, в которой выполняются элементарные операции заданного набора транзакций, называется графиком запуска набора транзакций.
Замечание. Очевидно, что для заданного набора транзакций может быть несколько (вообще говоря, достаточно много) различных графиков запуска.
Обеспечение изолированности пользователей, таким образом, сводится к выбору подходящего (в каком-то смысле правильного) графика запуска транзакций. Одновременно с этим график запуска должен быть оптимальным в некотором смысле, например, давать минимальное среднее время выполнения транзакций каждым пользователем.
Далее мы уточним понятие "правильного" графика и сделаем некоторые замечания об оптимальности.
Проблемы параллельной работы транзакций
Каким образом транзакции различных пользователей могут мешать друг другу? Различают три основные проблемы параллелизма:
Проблема потери результатов обновления.
Проблема незафиксированной зависимости (чтение "грязных" данных, неаккуратное считывание).
Проблема несовместимого анализа.
Рассмотрим подробно эти проблемы.
Рассмотрим
две транзакции, A и B, запускающиеся в
соответствии с некоторыми графиками.
Пусть транзакции работают с некоторыми
объектами базы данных, например со
строками таблицы. Операцию чтение
строки
будем
обозначать
,
где
-
прочитанное значение. Операцию записи
значения
в
строку
будем
обозначать
.
Проблема потери результатов обновления
Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения.
Транзакция A |
Время |
Транзакция B |
Чтение |
|
--- |
--- |
|
Чтение |
Запись |
|
--- |
--- |
|
Запись |
Фиксация транзакции |
|
--- |
--- |
|
Фиксация транзакции |
Потеря результата обновления |
|
|
Результат.
После окончания обеих транзакций,
строка
содержит
значение
,
занесенное более поздней транзакцией
B. Транзакция A ничего не знает о
существовании транзакции B, и естественно
ожидает, что в строке
содержится
значение
.
Таким образом, транзакция A потеряла
результаты своей работы.