BEGIN, COMMIT, ROLLBACK (работа с транзакциями)
Важно
Поддержка синтаксиса PostgreSQL в YDB находится в разработке. Использовать её в production окружениях не рекомендуется. Запросы в PostgreSQL могут исполняться до нескольких раз медленнее по сравнению с аналогичными запросами на YQL.
Основной сценарий, который можно тестировать — выполнение аналитических запросов к хранимым в YDB данным.
Транзакции – это способ группировки одной или нескольких операций с базой данных в единую единицу работы. Транзакция может состоять из одной или нескольких SQL-операций и использоваться для обеспечения согласованности данных. Транзакция обеспечивает гарантированное выполнение либо всех входящих в неё SQL-операций, либо ни одной. Транзакции управляются командами BEGIN
, COMMIT
, ROLLBACK
.
Транзакции выполняются внутри сессий. Сессия — это одно соединение с базой данных, которое начинается при подключении к базе данных и завершается при её отключении. Транзакция начинается с команды BEGIN
и завершается командой COMMIT
(успешное завершение) или ROLLBACK
(откат). Указывать BEGIN
, COMMIT
и ROLLBACK
не обязательно, часто их использование подразумевается неявно. В случае если сессия неожиданно прерывается, тогда все транзакции, которые были начаты в текущей сесcии – автоматически откатываются.
Рассмотрим каждую из команд:
BEGIN
– инициирует новую транзакцию. После выполнения этой команды все последующие операции с базой данных будут выполняться в рамках этой транзакции.COMMIT
– завершает текущую транзакцию, применяя все её операции. Если все операции в транзакции были успешными, результаты этих операций фиксируются (становятся постоянными). Изменения становятся видны последующим транзакциям.ROLLBACK
– откатывает текущую транзакцию, отменяя все её операции, если в процессе выполнения транзакции возникли ошибки или отмена транзакции производится приложением исходя из внутренней логики работы. Когда вызываетсяROLLBACK
, только изменения, сделанные в рамках текущей транзакции отменяются. Изменения, сделанные другими транзакциями (даже если они были запущены и завершены во время выполнения текущей транзакции), остаются нетронутыми. В случае если в процессе выполнения транзакции произошла ошибка, то дальнейшая работа с такой транзакцией становится невозможна – нужно делатьROLLBACK
, так как выполнениеCOMMIT
вернет ошибку. Если произойдет разрыв сессии во время активной транзакции – автоматически будет выполненROLLBACK
. Более подробную информацию про управление конкурентным доступом (MVCC) можно найти в этой статье.
Предположим, нужно внести изменения в разные строки таблицы для разных столбцов так, чтобы транзакция была объединена в одну рабочую единицу и имела гарантии ACID. Такая запись может выглядеть так:
--Начало транзакции
BEGIN;
-- Инструкция обновления данных
UPDATE people
SET name = 'Ivan'
WHERE id = 1;
-- Инструкция обновления данных
UPDATE people
SET lastname = 'Gray'
WHERE id = 10;
Если все данные верны – нужно выполнить инструкцию подтверждения транзакции:
COMMIT;
Примечание
В отличии от PostgreSQL, в YDB с используются оптимистические блокировки. Это значит, что транзакции проверяют условия выполнения необходимых блокировок в конце своей работы, а не в начале. Если за время выполнения транзакции блокировка была нарушена – такая транзакция завершится ошибкой Transaction locks invalidated
. В этом случае можно попробовать выполнить аналогичную транзакцию снова.