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. В этом случае можно попробовать выполнить аналогичную транзакцию снова.

Предыдущая
Следующая