---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://ydb.tech/docs/en/postgresql/statements/begin_commit_rollback.md?version=v25.3
  - https://ydb.tech/docs/ru/postgresql/statements/begin_commit_rollback.md?version=v25.3
  - href: ru/postgresql/statements/begin_commit_rollback.md
    type: text/markdown
    title: Markdown version
  - href: ../../llms.txt
    type: text/markdown
    title: llms.txt
sourcePath: ru/core/postgresql/statements/begin_commit_rollback.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ydb.tech/docs/ru/llms.txt

# BEGIN, COMMIT, ROLLBACK (работа с транзакциями)

<!-- source: ru/postgresql/_includes/alert_preview.md -->
{% note warning %}

Поддержка синтаксиса PostgreSQL в YDB **находится в разработке**. Использовать её в production окружениях **не рекомендуется**. Запросы в PostgreSQL могут исполняться до нескольких раз медленнее по сравнению с аналогичными запросами на YQL.

Основной сценарий, который можно тестировать — выполнение аналитических запросов к хранимым в YDB данным.

{% endnote %}
<!-- endsource: ru/postgresql/_includes/alert_preview.md -->

**Транзакции** – это способ группировки одной или нескольких операций с базой данных в единую единицу работы. Транзакция может состоять из одной или нескольких SQL-операций и использоваться для обеспечения согласованности данных. Транзакция обеспечивает гарантированное выполнение либо всех входящих в неё SQL-операций, либо ни одной. Транзакции управляются командами `BEGIN`, `COMMIT`, `ROLLBACK`.

Транзакции выполняются внутри сессий. Сессия — это одно соединение с базой данных, которое начинается при подключении к базе данных и завершается при её отключении. Транзакция начинается с команды `BEGIN` и завершается командой `COMMIT` (успешное завершение) или `ROLLBACK` (откат). Указывать `BEGIN`, `COMMIT` и `ROLLBACK` не обязательно, часто их использование подразумевается неявно. В случае если сессия неожиданно прерывается, тогда все транзакции, которые были начаты в текущей сесcии – автоматически откатываются.

Рассмотрим каждую из команд:

* `BEGIN` – инициирует новую транзакцию. После выполнения этой команды все последующие операции с базой данных будут выполняться в рамках этой транзакции.
* `COMMIT` – завершает текущую транзакцию, применяя все её операции. Если все операции в транзакции были успешными, результаты этих операций фиксируются (становятся постоянными). Изменения становятся видны последующим транзакциям.
* `ROLLBACK` – откатывает текущую транзакцию, отменяя все её операции, если в процессе выполнения транзакции возникли ошибки или отмена транзакции производится приложением исходя из внутренней логики работы. Когда вызывается `ROLLBACK`, только изменения, сделанные в рамках текущей транзакции отменяются. Изменения, сделанные другими транзакциями (даже если они были запущены и завершены во время выполнения текущей транзакции), остаются нетронутыми. В случае если в процессе выполнения транзакции произошла ошибка, то дальнейшая работа с такой транзакцией становится невозможна – нужно делать `ROLLBACK`, так как выполнение `COMMIT` вернет ошибку. Если произойдет разрыв сессии во время активной транзакции – автоматически будет выполнен `ROLLBACK`. Более подробную информацию про управление конкурентным доступом (MVCC) можно найти в [этой статье](https://ydb.tech/docs/ru/concepts/query_execution/mvcc.md?version=v25.3).

Предположим, нужно внести изменения в разные строки таблицы для разных столбцов так, чтобы транзакция была объединена в одну рабочую единицу и имела гарантии [ACID](https://ru.wikipedia.org/wiki/ACID). Такая запись может выглядеть так:

```sql
--Начало транзакции
BEGIN;

-- Инструкция обновления данных
UPDATE people
SET name = 'Ivan'
WHERE id = 1;

-- Инструкция обновления данных
UPDATE people
SET lastname = 'Gray'
WHERE id = 10;
```

Если все данные верны – нужно выполнить инструкцию подтверждения транзакции:

```sql
COMMIT;
```

<!-- source: ru/postgresql/_includes/alert_locks.md -->
{% note info %}

В отличии от PostgreSQL, в YDB с используются оптимистические блокировки. Это значит, что транзакции проверяют условия выполнения необходимых блокировок в конце своей работы, а не в начале. Если за время выполнения транзакции блокировка была нарушена – такая транзакция завершится ошибкой `Transaction locks invalidated`. В этом случае можно попробовать выполнить аналогичную транзакцию снова.

{% endnote %}
<!-- endsource: ru/postgresql/_includes/alert_locks.md -->