PostgreSQL - Транзакции
Транзакция — это единица работы, выполняемая с базой данных. Транзакции — это единицы или последовательности действий, выполняемых в логическом порядке вручную пользователем или автоматически какой-либо программой базы данных.
Транзакция — это распространение одного или нескольких изменений в базе данных. Например, если Вы создаете, обновляете или удаляете запись из таблицы, Вы выполняете транзакцию в таблице. Важно контролировать транзакции, чтобы обеспечить целостность данных и своевременно обрабатывать ошибки базы данных.
На практике Вы объедините несколько запросов PostgreSQL в группу и будете выполнять их все вместе как часть транзакции.
Свойства транзакций
Транзакция в PostgreSQL атомарная, согласованная, изолированная и устойчивая. Эти характеристики относятся к понятию ACID:
- Атомарность (Atomicity) Атомарность гарантирует, что никакая транзакция не будет зафиксирована в системе частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной;
- Согласованность (Consistency) гарантирует то, что любые изменения данных в базе данных обоснованные и следуют предопределенным правилам;
- Изоляция (Isolation) определяет то, насколько целостность транзакции вина другим транзакциям;
- Устойчивость (Durability) гарантирует то, что все проведенные транзакции будут сохранены в базе данных навсегда.
Контроль транзакций
Следующие команды используются для контроля транзакций:
- BEGIN TRANSACTION – начать транзакцию;
- COMMIT – сохранить изменения, альтернативный вариант - команда END TRANSACTION;
- ROLLBACK – откатить изменения назад.
Команды контроля транзакций осуществляются только с помощью DML команд INSERT, UPDATE и DELETE. Они не могут быть использованы при создании или удалении таблицы, поскольку данные операции автоматически фиксируются в базе данных.
Команда BEGIN TRANSACTION
Транзакции могут быть запущены при помощи команды BEGIN TRANSACTION или просто BEGIN. Такие транзакции обычно сохраняются до тех пор, пока не встретится следующая команда COMMIT или ROLLBACK. Но транзакция также будет откатана назад (ROLLBACK), если база данных будет закрыта или произойдет какая-либо ошибка.
Простой синтаксис для запуска транзакции:
BEGIN;
Или
BEGIN TRANSACTION;
Команда COMMIT
Команда COMMIT — это транзакционная команда, используемая для сохранения изменений, вызванных транзакцией, в базе данных.
Команда COMMIT сохраняет в базе данных все транзакции с момента последней команды COMMIT или ROLLBACK.
Синтаксис команды COMMIT следующий:
COMMIT;
или
END TRANSACTION;
Команда ROLLBACK
Команда ROLLBACK — это транзакционная команда, используемая для отмены транзакций, которые еще не были сохранены в базе данных.
Команду ROLLBACK можно использовать только для отмены транзакций с момента выполнения последней команды COMMIT или ROLLBACK.
Синтаксис команды ROLLBACK следующий:
ROLLBACK;
Пример
Рассмотрим таблицу COMPANY:
id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000
Теперь давайте начнем транзакцию и удалим записи из таблицы, имеющие возраст = 25, и, наконец, мы используем команду ROLLBACK, чтобы отменить все изменения.
testdb=# BEGIN; DELETE FROM COMPANY WHERE AGE = 25; ROLLBACK;
Результат будет следующим:
id | name | age | address | salary ----+-------+-----+-----------+-------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000
Теперь давайте начнем другую транзакцию и удалим записи из таблицы, имеющие возраст = 25, а затем используем команду COMMIT для фиксации всех изменений:
testdb=# BEGIN; DELETE FROM COMPANY WHERE AGE = 25; COMMIT;
Результат будет следующим:
id | name | age | address | salary ----+-------+-----+------------+-------- 1 | Paul | 32 | California | 20000 3 | Teddy | 23 | Norway | 20000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall | 45000 7 | James | 24 | Houston | 10000 (5 rows)



