Общие сведения об управлении параллелизмом с несколькими версиями (MVCC) и моментальных снимках

Завершено

Большинство систем управления базами данных (СУБД) использует блокировки для принудительного управления параллелизмом, однако PostgreSQL дополняет блокировку альтернативным подходом. PostgreSQL использует систему с именем "Управление параллелизмом с несколькими версиями" (MVCC), которая позволяет использовать несколько версий одной строки для повышения уровня параллелизма. При использовании этой системы каждый запрос видит предыдущий моментальный снимок данных, согласованных с транзакцией. MVCC гарантирует, что транзакция, которая считывает данные, не блокирует транзакцию, которая записывает данные и наоборот.

Например, подключение A выполняет запрос, который сканирует все строки таблицы. В то же время подключение Б выполняет запрос, который обновляет некоторые строки. MVCC позволяет одновременно выполнять оба запроса, создавая другую версию затронутых строк. Таким образом, подключение B может выполнять обновления, не затрагивая подключение A. Этот процесс достигается каждой версией строки, имеющей значение xmin для транзакции visible since и значение xmax для транзакции visible until. При использовании MVCC Подключение ion A игнорирует любые изменения, произошедшие после запуска запроса Подключение ion A.

Схема схемы управления параллелизмом с несколькими версиями, показывающая запрос на чтение исходных данных и запрос записи, обновляющий моментальный снимок.

Транзакции

Транзакции в СУБД — это атомарная единица работы, поэтому транзакция либо фиксируется полностью, либо вообще не фиксируется вовсе. Транзакции также используются для обеспечения параллелизма. С уровнями изоляции можно определить влияние одной транзакции на другие параллельные транзакции.

Вы запускаете транзакцию с помощью инструкции BEGIN TRANSACTION или START TRANSACTION. Вы выполняете транзакцию с помощью инструкции COMMIT, чтобы сохранить все изменения, внесенные в транзакцию, или инструкции ROLLBACK, чтобы отменить все изменения, внесенные транзакцией. Например:

BEGIN TRANSACTION;
    UPDATE production.workorder
        SET stockedqty=7
        WHERE workorderid=1;
COMMIT;