SQL транзакция: BEGIN, COMMIT и ROLLBACK
Транзакция объединяет несколько SQL-команд в одну логическую операцию: BEGIN начинает её, COMMIT сохраняет изменения, а ROLLBACK отменяет. Используйте транзакцию, когда частичный результат недопустим, например при переводе средств между счетами.
Проверить изменения и откатить
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 также часто транзакционны, но поведение отличается у некоторых СУБД и операций.
Сохранить изменения
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 изменения становятся видимыми согласно уровню изоляции и настройкам СУБД.
Команда | Назначение |
|---|---|
| Начать транзакцию |
| Зафиксировать изменения |
| Отменить незакоммиченные изменения |
| Создать точку частичного отката |
Что будет, если команда завершилась ошибкой?
В PostgreSQL транзакция переходит в ошибочное состояние и обычно требует ROLLBACK или ROLLBACK TO SAVEPOINT до следующих команд.