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