TRANSACTION в PostgreSQL: работа с транзакциями

Транзакция в PostgreSQL представляет собой последовательность операций, которые выполняются как единое целое. Либо все изменения внутри транзакции фиксируются (COMMIT), либо откатываются (ROLLBACK), обеспечивая целостность данных.

Основы работы с транзакциями

Транзакция начинается с BEGIN и завершается COMMIT или ROLLBACK:

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

Если в процессе выполнения возникает ошибка, можно отменить изменения:

BEGIN;
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
ROLLBACK;

Автоматические и явные транзакции

По умолчанию PostgreSQL работает в режиме автосохранения (autocommit), где каждая отдельная команда выполняется как отдельная транзакция. Чтобы управлять транзакциями вручную, используется BEGIN.

Использование SAVEPOINT

Внутри транзакции можно создавать точки сохранения (SAVEPOINT) и частично откатываться:

BEGIN;
  INSERT INTO orders (customer, amount) VALUES ('Иван', 100);
  SAVEPOINT sp1;
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  ROLLBACK TO sp1;
COMMIT;

После ROLLBACK TO sp1 откатится только изменение баланса, а вставка в orders сохранится.

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

Уровень изоляции определяет, как транзакции взаимодействуют друг с другом. В PostgreSQL можно задать уровень изоляции при старте транзакции:

BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

Уровень SERIALIZABLE гарантирует максимальную изоляцию, предотвращая одновременные изменения одних и тех же данных.