Транзакция в 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 гарантирует максимальную изоляцию, предотвращая одновременные изменения одних и тех же данных.