SQL транзакция: BEGIN, COMMIT и ROLLBACK

Категория: Postgresql · Язык: SQL · Обновлено:

Транзакция объединяет несколько SQL-команд в одну логическую операцию: BEGIN начинает её, COMMIT сохраняет изменения, а ROLLBACK отменяет. Используйте транзакцию, когда частичный результат недопустим, например при переводе средств между счетами.

Проверить изменения и откатить

SQL
CREATE TEMP TABLE inventory (id int PRIMARY KEY, quantity int);
INSERT INTO inventory VALUES (1, 10);

BEGIN;
UPDATE inventory SET quantity = quantity - 2 WHERE id = 1;
SELECT quantity FROM inventory WHERE id = 1;
ROLLBACK;
SELECT quantity FROM inventory WHERE id = 1;

После ROLLBACK останется исходное количество. В PostgreSQL команды DDL также часто транзакционны, но поведение отличается у некоторых СУБД и операций.

Сохранить изменения

SQL
CREATE TEMP TABLE inventory (id int PRIMARY KEY, quantity int);
INSERT INTO inventory VALUES (1, 10);
BEGIN;
UPDATE inventory SET quantity = quantity + 5 WHERE id = 1;
COMMIT;

После COMMIT изменения становятся видимыми согласно уровню изоляции и настройкам СУБД.

Команда

Назначение

BEGIN

Начать транзакцию

COMMIT

Зафиксировать изменения

ROLLBACK

Отменить незакоммиченные изменения

SAVEPOINT name

Создать точку частичного отката

Что будет, если команда завершилась ошибкой?

В PostgreSQL транзакция переходит в ошибочное состояние и обычно требует ROLLBACK или ROLLBACK TO SAVEPOINT до следующих команд.