Короткий ответ
Транзакция — последовательность операций с базой данных, которая выполняется как единое целое (unit of work): либо все операции успешно применяются, либо, если что-то пошло не так, все изменения откатываются, и база остаётся в прежнем состоянии. ACID — набор свойств, которым должна удовлетворять надёжная транзакция: Atomicity, Consistency, Isolation, Durability.
Как это работает подробнее
Классический пример — банковский перевод: если не прошло ни списание, ни зачисление, перевод целиком откатывается, и остатки не теряются. ACID особенно важен для систем с параллельным доступом и финансовыми операциями, где целостность данных критична.
- Atomicity — атомарность: транзакция выполняется полностью или не выполняется вовсе; при ошибке одной операции все изменения откатываются.
- Consistency — согласованность: после завершения база остаётся в валидном состоянии, соблюдены правила и ограничения (например, остаток на складе не отрицательный).
- Isolation — изоляция: параллельные транзакции не влияют друг на друга; уровни изоляции — Read Uncommitted, Read Committed, Repeatable Read, Serializable.
- Durability — долговечность: после commit изменения сохраняются постоянно, даже при сбое системы или перезапуске сервера.
Пример кода
Транзакция перевода
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
-- при ошибке вместо COMMIT выполняется ROLLBACKЧто использовать на практике
- Группируйте связанные изменения (например, списание и зачисление) в одну транзакцию.
- В Spring используйте декларативные транзакции через аннотацию
@Transactional.