SQL/Транзакции

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск
Либо всё, либо ничего.— Девиз транзакций

Транза́кция (англ. transaction) — группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными, которую можно подтвердить, либо откатить.

История создания

Наиболее частой для ПО работающего с СУБД является операция перевода чего-либо (баллов, очков и пр.) с счета на счет. Делается это всегда в несколько запросов к БД. Представим, что первый запрос удачно выполнился, а второй по каким-либо причинам (ошибка базы данных, ошибка на сервере и т. д.) нет. Для того чтобы избежать этого нужно чтобы оба запроса выполнялись как одно целое. Если возникла ошибка в одном запросе, то не выполнились бы остальные. Для этого и был придуман механизм транзакций — объединение нескольких операций в единое целое (транзакцию).

Концепция

Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта. Транзакции обрабатываются транзакционными системами, в процессе работы которых создаётся история транзакций.

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

  1. Atomicity — Атомарность
  2. Consistency — Согласованность
  3. Isolation — Изолированность
  4. Durability — Надежность

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

  • 0 — Чтение неподтверждённых данных (грязное чтение) (Read Uncommitted, Dirty Read) — чтение незафиксированных изменений как своей транзакции, так и параллельных транзакций. Нет гарантии, что данные, изменённые другими транзакциями, не будут в любой момент изменены в результате их отката, поэтому такое чтение является потенциальным источником ошибок. Невозможны потерянные изменения (lost changes), возможны неповторяемое чтение и фантомы.
  • 1 — Чтение подтверждённых данных (Read Committed) — чтение всех изменений своей транзакции и зафиксированных изменений параллельных транзакций. Потерянные изменения и грязное чтение не допускается, возможны неповторяемое чтение и фантомы.
  • 2 — Повторяемое чтение (Repeatable Read, Snapshot) — чтение всех изменений своей транзакции, любые изменения, внесённые параллельными транзакциями после начала своей, недоступны. Потерянные изменения, грязное и неповторяемое чтение невозможны, возможны фантомы.
  • 3 — Сериализуемый — (Serializable) — сериализуемые транзакции. Результат параллельного выполнения сериализуемой транзакции с другими транзакциями должен быть логически эквивалентен результату их какого-либо последовательного выполнения. Проблемы синхронизации не возникают.

SQL операторы транзакций

  • START TRANSACTION или BEGIN — старт (начало) транзакции
  • ROLLBACK — откат действий, отмена всех действий транзакции
  • COMMIT — подтверждение (применение) всех действий транзакции

После команды START TRANSACTION все последующие действия считаются шагами транзакции до команды ROLLBACK или COMMIT.

Основополагающие транзакций

  • Разрыв сессии (соединения с сервером) равносилен действию отката (ROLLBACK) всей транзакции.

SQL операторы установки уровней изоляции транзакций

  • SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  • SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL READ COMMITTED;
  • SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL REPEATBLE READ;
  • SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL SERIALIZEBLE;

Транзакции в различных СУБД

  • Коммерческие популярные СУБД от Oracle, IBM и Microsoft поддерживают транзакции.
  • В СУБД MySQL транзакции работают на движке таблиц InnoDB и не работают на MyISAM.