Транзакции

Содержание

Транзакция

  • Минимальный фиксируемый в БД объем работы
  • Неявные транзакции
    • Для каждого оператора
  • Нетранзакционные действия
    • Изменение схемы

Примеры транзакций

  • Простая транзакция
    • Добавление нового счета
    • insert into accs (id, money) values (1, 0);
      
  • Составная транзакция
    • Перевод денег
    • update accs set money = money - 100 where id = 1;
      update accs set money = money + 100 where id = 2;
      
    • При переводе количество денег в системе должно сохраняться

Управление транзакциями

  • Старт транзакции
    • start transaction
      
  • Завершение транзакции
    • commit
      
    • Изменения фиксируются в базе данных
  • Откат транзакции
    • rollback
      
    • Изменения игнорируются
    • Может производиться автоматически

Пример условной транзакции

  • Перевод денег с проверкой баланса
    • start transaction;
      if ((select money from accs where id = 1) ≤ 100)
          rollback;
      update accs set money = money - 100 where id = 1;
      update accs set money = money + 100 where id = 2;
      commit;
      

Свойства транзакций (ACID)

  • Атомарность (atomicity)
    • Все или ничего
  • Согласованность (consistency)
    • После транзакции БД остаётся в согласованном состоянии
  • Изоляция (isolation)
    • Транзакции не взаимодействуют между собой
  • Устойчивость (durability)
    • Изменения не теряются

Корректность и согласованность

  • Согласованность
    • Состояние БД удовлетворяет ограничениям
    • Автоматически проверяется СУБД
  • Корректность
    • Состояние БД соответствует реальному миру
    • Совместимость + дополнительные ограничения
  • Сохранение денег при переводе
    • Невозможно задать ограничениями
    • Требуется в реальном мире

Минимизация транзакций

  • Транзакции должны быть по возможности минимальны
    • Лучше всего – неявные
  • Препятствия минимизации
    • Условное обновление
    • Множественное обновление
    • Промежуточная несовместимость
  • Человеческий фактор
    • Завершение транзакции не должно зависеть от людей

Устойчивость

  • Результаты завершённой транзакции сохраняются в БД даже при сбоях
  • Оперативная память
    • Потери при перезагрузке
    • ⇒ хранение информации на диске
  • Диски
    • Избыточность
    • Быстрые чтение и запись – последовательные

Типы сбоев

  • Локальный
    • Одна транзакция
  • Глобальный
    • Все транзакции
  • Аппаратный
    • Потеря данных в памяти
  • Отказ оборудования
    • Потеря данных на дисках

Восстановление после сбоя

  • Транзакции
    • Подтверждённые – зафиксировать
    • Откаченные – откатить
    • Незавершённые – откатить
  • Где взять данные для отката?
    • Писать изменённые данные в новое место
      (shadow copy)
    • Писать данные в старое место + журнал изменений (transaction log)

Журнал транзакций

  • Надёжное хранилище изменений
    • Записывается последовательно
  • Что записывается
    • Старые данные
    • Новые данные
    • Маркеры начала и завершения транзакций
  • Завершение транзакции
    • Запись всех изменений в журнал
    • Запись маркера завершения транзакции
    • Уведомление о завершении транзакции

Реализация журнала

  • Постоянная запись на диск
    • Много операций
    • Данные откаченных транзакций
    • Конкуренция за доступ к диску
  • Запись при завершении
    • Хранение изменений в памяти
    • Запись при завершении
    • Что делать с большим объёмом данных?

Точки восстановления

  • «Слепок» состояния системы
    • Текущие изменения
    • Завершённые транзакции
    • Откаченные транзакции
    • Открытые транзакции
  • Требует приостановки изменений
    • Чем реже – тем лучше
    • Чем чаще – тем меньше памяти

Структура журнала

  • Точка восстановления
  • События
    • Идентификатор транзакции
    • Указатель на предыдущее событие транзакции
  • Типы событий
    • Начало транзакции
    • Изменение
    • Завершение транзакции
    • Откат транзакции

Транзакции после сбоя (1)

Транзакции после сбоя (2)

  • Обязательное поведение

Восстановление после сбоя

  • Фазы классического алгоритма
    • Разметка транзакций
    • Откат транзакций
    • Повтор транзакций
  • Множества транзакций
    • Redo – повторить (накатить)
    • Undo – откатить

Фаза разметки транзакций

  • Разбиение транзакций на Redo и Undo
  • Чтение журнала
    • От последней контрольной точки до конца
  • Алгоритм
    • Контрольная точка – поместить все открытые транзакции в Undo
    • Маркер начала – добавить транзакцию в Undo
    • Маркер конца – перенести транзакцию из Undo в Redo

Фаза отката транзакций

  • Откат транзакций из Undo
  • Чтение журнала
    • От конца к началу
    • Пока Undo не пуст
  • Алгоритм
    • Маркер начала – удалить транзакцию из Undo
    • Изменение – если транзакция в Undo, откатить

Фаза повторения транзакций

  • Повтор транзакций из Redo
  • Чтение журнала
    • От последней контрольной точки до конца
  • Алгоритм
    • Маркер конца – удалить транзакцию из Redo
    • Изменение – если транзакция в Redo, применить

Длина журнала

  • Когда можно удалять данные из журнала?
    • Закончены все открытые транзакции
    • По точкам восстановления
    • Удаляется префикс

Повторные сбои

  • Сбои во время восстановления
  • Восстановление в памяти
    • Устойчиво к повторным сбоям
    • Памяти для Undo может не хватить
    • Почему хватит памяти для Redo?
  • Запись на диск
    • Дополнение журнала транзакций

Классический алгоритм

  • Откат изменения – тоже изменение
  • Действия при откате
    • Откатить изменение
    • Внести запись об обратном изменении
  • Повторение всех действий при сбое
    • Рост анализируемой части журнала
  • Что делать?

Алгоритм ARIES

  • Фазы алгоритма
    • Разметка транзакций
    • Повторение истории
    • Откат транзакций

Фаза повторения истории

  • Восстановление состояния системы на момент сбоя
  • Чтение журнала
    • От последней контрольной точки до конца
  • Алгоритм
    • Изменение – применить
  • Можно объединить с разметкой транзакций

Фаза отката транзакций

  • Восстановление корректного состояния системы
  • Чтение журнала
    • Для транзакций из Undo
    • От конца к началу
  • Алгоритм
    • Изменение – откатить

Повторные сбои

  • Компенсационные записи
  • Действия при откате
    • Откатить изменение
    • Записать на диск
    • Внести компенсационную запись
  • Повторение действий не требуется

Классический алг. vs ARIES

  • Количество проходов
    • Классический алгоритм – 3
    • ARIES – 2
  • Рост журнала транзакций
    • Классический алгоритм – записи отмены
    • ARIES – компенсационные записи
  • Повторные сбои
    • Классический алгоритм – потеря эффективности
    • ARIES – постепенное завершение

Методы борьбы

  • Репликация данных
  • Избыточность оборудования
  • Резервное копирование

Репликация данных

  • Несколько БД, содержащих одинаковые данные
    • Желательно в разных местах
  • В процессе работы
    • Поддержка синхронности
    • Распределённые транзакции
  • При отказе
    • Копия назначается основной базой

Избыточность оборудования

  • Несколько копий данных БД
    • В одной системе
  • В процессе работы
    • Параллельная запись
    • RAID
  • При отказе
    • Замена диска
    • Копирование данных

Резервное копирование

  • Периодическое копирование всей БД
    • Хранится отдельно
  • В процессе работы
    • Получение «слепков» базы
    • Немного устаревшие данные
  • При отказе
    • Восстановление данных из «слепка»
    • Повторное внесение данных

Изоляция

  • Транзакции могут исполняться параллельно
    • Транзакция должна исполняться так, как будто она в системе одна
    • Транзакции, корректные по отдельности, должны быть корректны в совокупности
  • Исполнение транзакций в разных потоках
    • Синхронизация
    • Блокировки
  • Каких проблем можно ожидать?

Потерянное обновление (1)

  • Обновление, сделанное транзакцией 1, потеряно
    Транзакция 1 Транзакция 2
    retrieve v

    update v

    commit
     

    retrieve v

    update v

    commit

Потерянное обновление (2)

  • Обновление, сделанное транзакцией 1, потеряно
    Транзакция 1 Транзакция 2

    update v
    commit

    update v


    rollback

Незафиксированное изменение

  • Значение, полученное транзакцией 1, не было зафиксировано
    Транзакция 1 Транзакция 2

    retrieve v

    commit
    update v

    rollback

Несогласованное состояние

  • Значение, полученное транзакцией 1, не могло быть получено в согласованном состоянии
    Транзакция 1 Транзакция 2

    retrieve v_1
    retrieve v_2

    commit

    update v_1 = v_1 - 10


    update v_2 = v_2 + 10

    commit

Типы конфликтов

  • Чтение – чтение
    • Нет конфликтов
  • Чтение – запись
    • Некорректное состояние
  • Запись – чтение
    • Зависимость от незафиксированного изменения
  • Запись – запись
    • Потерянное обновление

Блокировки

  • Типы блокировок
    • отсутствует
    • S разделяемая, для чтения
    • X эксклюзивная, для чтения и записи
  • Совместимость блокировок
    SX
    + + +
    S + +
    X +

Строгий протокол двухфазной блок.

  • Чтение
    • Получение S
  • Запись
    • Получение X
  • Завершение или откат транзакции
    • Освобождение всех блокировок

Взаимная блокировка

  • Пример взаимной блокировки (ВБ)
    Транзакция 1 Транзакция 2
    retrieve v_1

    update v_2


    retrieve v_2

    update v_1
  • Что делать?

Устранение ВБ

  • Строим граф ожиданий
    • Если есть цикл – ВБ
  • Ставим таймауты
    • Если долго нет прогресса – скорее всего ВБ
  • Обнаружена ВБ
    • Откатываем одну из транзакций
    • При возможности, автоматически перезапускаем транзакции

Предотвращение ВБ

  • Стратегия обработки конфликтов
    • Транзакция A претендует на блокировку, конфликтующую с блокировками транзакции B
  • Стратегия ожидание-отмена
    • A началась раньше BA ожидает
    • A началась позже BA отменяется
  • Стратегия отмена-ожидание
    • A началась раньше BB отменяется
    • A началась позже BA ожидает
  • Почему стратегии работают?
  • Стратегии порождают много лишних откатов

Упорядочиваемость

  • Любая последовательность исполнения транзакций эквивалентна какому-то последовательному исполнению
    • Последовательное исполнение – транзакции выполняются одна за другой
    • Эквивалентность исполнений – равенство состоянии до начала ⇒ равенство состояний после окончания

Упорядочив. и блокировки

  • Строгий протокол двухфазной блокировки гарантирует упорядочиваемость
  • Двухфазная блокировка
    • Получение блокировки до операции
    • После отпускания любой блокировки больше получать блокировки нельзя
  • Теорема о двухфазной блокировке
    • Если все транзакции используют протокол двухфазной блокировки ⇒ все исполнения упорядочиваемы

Восстановление и параллелизм

  • Пример конфликта
    Транзакция 1 Транзакция 2

    retrieve v
    commit

    update v


    rollback
  • Зафиксировано изменение, зависящее от незафиксированного

Восстанавливаемость

  • Критерий восстанавливаемости
    • Если транзакция A использует значения, обновлённые транзакцией B, то A должна завершиться позже чем B
  • Почему не бывает противоречий?
    • В случае противоречия возникает ВБ
  • Форсированные откаты
    • Откат транзакции B форсирует откат транзакции A
    • Цепочки откатов

Отсутствие цепочек откатов

  • Критерий
    • Если транзакция A использует значения, обновлённые транзакцией B, то A не может завершиться до завершения B
  • Почему строгий протокол блокировки удовлетворяет критерию?

Типы блокировок

  • Блокировка записи/полей
    • Блокировка страницы
  • Блокировка таблицы
    • Блокировка индекса
  • Блокировка базы данных

Блокировки записей/полей

  • Блокировки записей/полей
    • Блокируются
      • Записи целиком
      • Отдельные поля
    • Высокий параллелизм
    • Много ресурсов
  • Блокировки страниц
    • Блокируется страница, содержащая запись
  • Эскалация блокировки
  • Фантомные записи
    • При повторном чтении могут появиться новые записи

Блокировки таблиц

  • Блокировки таблиц
    • Блокируются таблицы целиком
    • Низкий параллелизм
    • Мало ресурсов
    • Отсутствие фантомов
  • Блокировки индексов
    • Блокируется элемент или страница индекса
    • ⇒ запрет на добавление и удаление

Блокировка базы данных

  • Резервное копирование
  • Изменение определений таблиц и представлений
  • Изменение хранимых процедур и функций
  • Изменение прав доступа

Уровни изоляции транзакций

Содержание

Уровни изоляции транзакций

  • Упорядочиваемый (serializable)
    • Наиболее сильные гарантии
    • Самое медленное исполнение
  • «Слепок» (snapshot)
  • Повторяемое чтение (repeatable read)
  • Чтение зафиксированных (read committed)
  • Чтение незафиксированных (read uncommitted)

«Слепок»

  • Каждая транзакция работает со своим «слепком» БД
    • Используется вместо упорядочиваемого
    • Не соответствует SQL
  • Реинтеграция изменений
    • Изменения фиксируются при отсутствии конфликтов изменений
  • Аномалия «косая запись»
    • Одновременное обновление разных записей, основанное на одних и тех же данных

Пример «косой записи»

  • Инвариант v_1 + v_2 ≥ 0
    • Транзакция 1
      if v_1 + v_2 ≥ Δ begin
         v_1 = v_1 − Δ
      end if
      
    • Транзакция 2
      if v_1 + v_2 ≥ Δ begin
         v_2 = v_2 − Δ
      end if
      

Повторяемое чтение

  • При повторном чтении значения не меняются
  • Блокировка записей или страниц на чтение
  • Аномалия «фантомная запись»
    • При повторном чтении могут появиться новые записи

Чтение зафиксированных

  • Чтение значений, зафиксированных другими транзакциями
  • Частичные блокировки записей или страниц
  • Аномалия «неповторяемое чтение»
    • При повторном чтении значение может измениться

Чтение незафиксированных

  • Чтение текущих значений
    • В SQL – только чтение
  • Блокировки отсутствуют
  • Аномалия «грязное чтение»
    • Может быть прочитано незафиксированное значение

Уровни изоляции и аномалии

Аномалия / Уровень   S   SN RR RC RU
Косая запись  −  + + + +
Фантомная запись + + +
Неповторяемое чтение + +
Грязное чтение +

Начало транзакции

  • Синтаксис
    • start transaction [режим] [изоляция] [настройки]
      
  • Режим
    • read {only | write}
      
    • По умолчанию – чтение и запись (если не RU)
  • Изоляция
    • [isolation level уровень]
      
    • По умолчанию – упорядочиваемый
  • Начинает транзакцию с указанными уровнями доступа и изоляции

Конец транзакции

  • Синтаксис
    • commit [work] [and [no] chain]
      
    • rollback [work] [and [no] chain]
      
  • Фиксирует или откатывает транзакцию
    • work – ничего не значит
    • and chain – сразу начать новую транзакцию с теми же настройками

Вложенные транзакции

  • Пример 1
    • start transaction isolation level serializable;
          // 1
      start transaction isolation level read committed;
          // 2
      
  • Пример 2
    • start transaction isolation level read committed;
          // 1
      start transaction isolation level serializable;
          // 2
      commit and no chain;
          // 3
      rollback;
      

Точки сохранения

  • Создание точки сохранения
    • savepoint имя
      
    • Имя локально внутри транзакции
  • Возвращается к точке сохранения
    • rollback to savepoint имя
      
    • Позволяет делать частичный откат транзакции
  • Отмена точки сохранения
    • release savepoint имя
      
    • Освобождает ресурсы
    • После окончания транзакции все точки сохранения отменяются

Ограничения

  • Объявление
    • add constraint ... режим
      
    • not deferrable – не откладываемая
    • deferrable initially immediate – отклад. по запросу
    • deferrable initially deferred – отклад. по умолчанию
  • Установка режима
    • set constraints {all|имена} {deferred|immediate}
      
    • immediate – после каждого запроса
    • deferred – при завершении транзакций

Литература

Содержание

Основная литература

Дополнительная литература