Что такое транзакция


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

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

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

  1. Atomicity (атомарность)
    Гарантирует, что все операции внутри транзакции выполняются как единое целое. Если одна из операций не может быть выполнена, то все остальные отменяются. Например, при переводе денег между счетами транзакция либо переводит деньги с одного счета на другой полностью, либо не делает ничего.

  2. Consistency (согласованность)
    Транзакция переводит базу данных из одного согласованного состояния в другое. Это означает, что все правила и ограничения базы (например, внешние ключи, ограничения целостности, типы данных) соблюдаются как до, так и после выполнения транзакции.

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

  4. Durability (долговечность)
    После завершения транзакции (коммита) её изменения становятся постоянными и сохраняются в системе даже при сбоях, перезагрузке сервера и т.п. Это обычно обеспечивается журналированием и системой резервного копирования.

Жизненный цикл транзакции

  1. Начало транзакции (BEGIN, START TRANSACTION)

  2. Выполнение операций (INSERT, UPDATE, DELETE и др.)

  3. Завершение:

    • COMMIT — подтверждает транзакцию, все изменения сохраняются;

    • ROLLBACK — откатывает все изменения, внесённые в ходе транзакции, возвращая систему в исходное состояние.

Пример (SQL):

BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

Если что-то пойдет не так между двумя UPDATE, можно вызвать ROLLBACK вместо COMMIT.

Типы транзакций

  • Явные — транзакции начинаются и завершаются вручную через команды BEGIN, COMMIT, ROLLBACK.

  • Неявные — автоматически запускаются СУБД, когда происходит изменение данных, и могут быть закоммичены/откачены в зависимости от конфигурации.

  • Вложенные транзакции — поддержка разных уровней вложенности внутри одной сессии (не всеми СУБД поддерживается напрямую).

  • Распределённые транзакции — охватывают несколько баз данных или ресурсов, синхронизируются через протокол двухфазного коммита (2PC — Two Phase Commit).

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

Изоляция определяет, как изменения одной транзакции видны другим. Стандарт SQL определяет четыре уровня:

  1. Read Uncommitted
    Транзакции могут читать изменения, которые ещё не были зафиксированы другими транзакциями (грязное чтение — dirty read).

  2. Read Committed
    Чтение возможно только после фиксации данных другой транзакцией. Грязные чтения исключаются, но может возникнуть неповторяемое чтение (non-repeatable read).

  3. Repeatable Read
    Гарантирует, что если данные были прочитаны однажды в транзакции, они не изменятся до её завершения. Однако не исключает фантомные чтения (вставка новых строк, соответствующих условию, другой транзакцией).

  4. Serializable
    Самый высокий уровень изоляции — обеспечивает полную изоляцию транзакций. Эффект аналогичен последовательному выполнению.

Проблемы, которые решаются транзакциями

  • Грязное чтение (Dirty Read) — транзакция читает данные, которые не были зафиксированы другой транзакцией.

  • Неповторяемое чтение (Non-repeatable Read) — при повторном чтении того же объекта получаются разные значения, так как другая транзакция изменила его между запросами.

  • Фантомные чтения (Phantom Read) — при повторном выполнении одного и того же запроса появляются новые строки, добавленные другими транзакциями.

  • Lost Update (потерянное обновление) — две транзакции читают одно и то же значение и на основе его обновляют данные, не зная об изменениях друг друга.

Транзакции в других языках и технологиях

  • JDBC (Java) — управление транзакциями через методы setAutoCommit(false), commit(), rollback().

  • Spring Framework — аннотации @Transactional, управление транзакциями через аспекты.

  • ORM (например, Hibernate, Doctrine) — предоставляют абстракции для управления транзакциями через API.

  • NoSQL — не все поддерживают транзакции в классическом понимании. Например:

    • MongoDB: поддерживает транзакции на уровне документа, с версии 4.0 — и многодокументные.

    • Redis: поддерживает команды MULTI, EXEC, WATCH.

Транзакции в файловых системах и других контекстах

Хотя термин чаще используется в контексте баз данных, транзакции применяются и в других областях:

  • Файловые системы — операции записи файлов могут быть обернуты в транзакции (пример: NTFS с журналированием).

  • API — некоторые REST или SOAP API реализуют логическую транзакционность с помощью состояния и откатов.

  • Микросервисы — используют саги (Saga Pattern) или оркестрацию через очереди и компенсационные действия.

Заключение по терминологии

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

  • Технологии управления транзакциями варьируются в зависимости от среды: SQL, NoSQL, ORM, распределённые системы.

  • Грамотное использование транзакций — важный аспект проектирования высоконагруженных и отказоустойчивых приложений.