PostgreSQL TRANSACTION (Транзакция)

TRANSACTION (транзакция) — это логическая единица в процессе выполнения системы управления базами данных, состоящая из конечной последовательности операций с базой данных.

Транзакция базы данных обычно состоит из последовательности операций чтения/записи над базой данных. Она служит следующим двум целям:

  • Она предоставляет способ восстановления последовательности операций базы данных из состояния сбоя в нормальное состояние, а также способ сохранения согласованности базы данных даже в аномальных условиях.
  • Когда несколько приложений одновременно обращаются к базе данных, она может обеспечить метод изоляции между этими приложениями, чтобы их операции не мешали друг другу.

Когда транзакция передаётся в систему управления базами данных (СУБД), СУБД должна гарантировать, что все операции в транзакции успешно завершены, а их результаты навсегда сохранены в базе данных. Если какая-либо операция в транзакции не завершилась успешно, все операции в транзакции необходимо откатить к состоянию, в котором база данных находилась до выполнения транзакции. В то же время транзакция не влияет на базу данных или выполнение других транзакций; все транзакции выглядят так, как будто выполняются независимо.

Свойства транзакции

Транзакция обладает следующими четырьмя стандартными свойствами, часто сокращаемыми как ACID:

  • Атомарность: транзакция выполняется как единое целое; содержащиеся в ней операции над базой данных выполняются либо все, либо ни одна.
  • Согласованность: транзакция должна гарантировать, что состояние базы данных переходит из одного согласованного состояния в другое согласованное состояние. Согласованное состояние означает, что данные в базе данных должны удовлетворять ограничениям целостности.
  • Изолированность: когда несколько транзакций выполняются одновременно, выполнение одной транзакции не должно влиять на выполнение других транзакций.
  • Долговечность: изменения, внесённые в базу данных зафиксированной транзакцией, должны быть навсегда сохранены в базе данных.

Примеры

Человек хочет купить в магазине что-то стоимостью 100 юаней с помощью электронных денег. Для этого требуется как минимум две операции:

  • Счёт этого человека уменьшается на 100 юаней.
  • Счёт магазина увеличивается на 100 юаней.

Система управления базами данных, поддерживающая транзакции, должна обеспечивать, чтобы вышеуказанные две операции (вся «транзакция») могли быть либо обе выполнены, либо обе отменены; иначе возникла бы ситуация, когда 100 юаней исчезают или появляются из ниоткуда.

Управление транзакциями

Используйте следующие команды для управления транзакциями:

    BEGIN TRANSACTION: начать транзакцию.
  • COMMIT: зафиксировать транзакцию, или можно использовать команду END TRANSACTION.
  • ROLLBACK: откатить транзакцию.

Команды управления транзакциями используются только с INSERT, UPDATE и DELETE. Их нельзя использовать при создании или удалении таблиц, поскольку эти операции автоматически фиксируются в базе данных.

Команда BEGIN TRANSACTION

Транзакцию можно начать с помощью команды BEGIN TRANSACTION или просто команды BEGIN. Такая транзакция обычно продолжает выполняться до тех пор, пока не встретится следующая команда COMMIT или ROLLBACK. Однако обработка транзакции также откатывается, когда база данных закрывается или возникает ошибка. Ниже приведён простой синтаксис запуска транзакции:

BEGIN;

或者

BEGIN TRANSACTION;

Команда COMMIT

Команда COMMIT — это транзакционная команда, используемая для сохранения изменений, сделанных транзакцией, в базе данных, то есть для фиксации транзакции.

Синтаксис команды COMMIT выглядит следующим образом:

COMMIT;

或者

END TRANSACTION;

Команда ROLLBACK

Команда ROLLBACK — это транзакционная команда, используемая для отмены изменений, ещё не сохранённых в базе данных, то есть для отката транзакции.

Синтаксис команды ROLLBACK выглядит следующим образом:

ROLLBACK;

Пример

Создайте таблицу COMPANY (Скачайте SQL-файл COMPANY), со следующими данными:

exampledb# select * from 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
(7 rows)

Теперь давайте начнём транзакцию, удалим из таблицы записи с age = 25 и, наконец, используем команду ROLLBACK, чтобы отменить все изменения.

exampledb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
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

Теперь давайте начнём другую транзакцию, удалим из таблицы записи с age = 25 и, наконец, используем команду COMMIT, чтобы зафиксировать все изменения.

exampledb=# BEGIN;
DELETE FROM COMPANY WHERE AGE = 25;
COMMIT;

Проверьте таблицу COMPANY, записи были удалены:

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)
Другие расширения