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