Распределённые данные · проверено по источникам

Транзакция базы данных

Транзакция базы данных объединяет связанные чтения и изменения в одну единицу работы. Фиксация принимает её результат, откат отменяет транзакционные изменения. В состав входят только операции и ресурсы, которыми действительно управляет эта транзакция.

Также ищут: Database transaction · transaction block

Практический смысл

Почему это важно

При оформлении заказа нужно создать заказ и уменьшить доступный остаток. Если второй шаг не удался, первый не должен остаться отдельным успешным результатом. Сначала установите границу этих изменений в базе, затем отдельно разберите оплату, письмо покупателю и публикацию сообщения: общий обработчик запроса не объединяет их автоматически.

Доказательная часть

Что подтверждено

  1. Транзакция группирует чтения и изменения связанных данных в одну управляемую единицу. В PostgreSQL 18 явный блок начинается с BEGIN, завершается COMMIT при принятии результата или ROLLBACK при отмене изменений.

    Граница применимости: Общая модель транзакции и явный блок SQL в PostgreSQL 18; поведение обёртки или клиентской библиотеки проверяют отдельно.

  2. Локальная транзакция базы не включает внешний платёж, письмо или HTTP-вызов только потому, что приложение выполнило их между BEGIN и COMMIT. Если внешняя система не участвует в общей транзакции, её выполненное действие требует отдельной координации или компенсации.

    Граница применимости: Редакторское сопоставление локальной транзакции с независимым внешним эффектом; не утверждение о возможностях конкретного платёжного API.

  3. В PostgreSQL 18 отдельная SQL-команда без общего блока транзакции выполняется в собственной транзакции. Поэтому успешная запись заказа и следующая неудачная команда изменения остатка могут дать частичный результат, если клиент не объединил их в один блок.

    Граница применимости: PostgreSQL 18: две отдельно отправленные команды без BEGIN и без неявного объединения клиентской библиотекой. Пример заказа — применение правила автоматической фиксации.

  4. Для заказа с двумя связанными изменениями проверка отката должна прервать выполнение после первого изменения, но до фиксации. После завершённого ROLLBACK в транзакционных таблицах не должны оставаться ни новый заказ, ни уменьшенный этим заказом остаток.

    Граница применимости: Редакторский приёмочный сценарий для одной локальной транзакции; обе операции принадлежат ей, исходное состояние известно, внешние эффекты исключены.

  5. В PostgreSQL 18 точка сохранения SAVEPOINT позволяет отменить изменения после неё командой ROLLBACK TO и продолжить ту же транзакцию. Изменения до точки сохраняются внутри незавершённой транзакции; окончательное решение по ним всё ещё требует COMMIT или полного ROLLBACK.

    Граница применимости: Точки сохранения явного блока транзакции PostgreSQL 18; точка сохранения сама не фиксирует результат.

  6. Общий BEGIN задаёт границу транзакции, но сам по себе не закрепляет один снимок данных на все чтения. В PostgreSQL 18 на Read Committed два обычных SELECT могут увидеть изменение, которое другая транзакция зафиксировала между ними.

    Граница применимости: PostgreSQL 18, Read Committed, обычные последовательные SELECT без собственных изменений выбранной строки.

Граница терминов

Не путать

Атомарность транзакции

Транзакция задаёт единицу работы и её границы. Атомарность — требование к результату внутри этих границ: транзакционные изменения принимаются вместе либо отменяются. Перечень вызовов функции ещё не определяет такую границу для внешних систем.

Двухфазная фиксация (2PC)

Локальный блок SQL управляет своей транзакцией. Двухфазная фиксация согласует решение нескольких участников через подготовку и последующее решение координатора. Она требует поддержки участников; обычное письмо или произвольный HTTP-вызов участником не становятся.

Перед спецификацией

Что проверить

  1. Нарисуйте одну операцию заказа: чтение цены, проверка остатка, создание заказа, резерв, оплата и уведомление.
  2. Отметьте, какие изменения входят в один блок базы и одно соединение, а какие выполняются независимо.
  3. Проверьте режим автоматической фиксации драйвера и реальные команды начала и завершения транзакции.
  4. Прервите тест после записи заказа до изменения остатка, выполните откат и сверяйте обе таблицы.
  5. Повторите сценарий с точкой сохранения: отдельно проверьте сохранённую и отменённую части транзакции.
  6. Запустите второй сеанс между двумя чтениями первого и сопоставьте результат с выбранным уровнем изоляции.
  7. Для уже выполненной оплаты или отправленного письма укажите самостоятельный способ выяснить результат и исправить частичное выполнение.
Открытые основания

Первоисточники

  • Первичная публикация

    The Transaction Model — Turing Award Lecture

    Microsoft Research / ACM · Jim Gray, FCRC 1999 lecture slides

    Первичный обзор transaction model, ACID, concurrency anomalies, logs и two-phase commit.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Transactions

    PostgreSQL Global Development Group · документация PostgreSQL 18, страница открыта 7 сентября 2026 года

    Открыт редактором 7 сентября 2026 года, заголовок документа сверен. Проверить границы BEGIN/COMMIT/ROLLBACK, отдельные транзакции без BEGIN, точки сохранения и оговорку о поведении клиентских библиотек.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: PREPARE TRANSACTION

    PostgreSQL Global Development Group · PostgreSQL 18 SQL command reference

    Описывает prepared transaction, external transaction manager и operational risk forgotten prepared state.

    Открыть первоисточник
  • Официальная документация

    PostgreSQL 18 Documentation: Transaction Isolation

    PostgreSQL Global Development Group · PostgreSQL 18, Chapter 13.2

    Определяет isolation phenomena и фактическое поведение PostgreSQL levels, включая Serializable.

    Открыть первоисточник
Сообщить об ошибке

Опишите проблему — постараемся исправить как можно скорее.

Спасибо!

Получили ваше сообщение.
Подтвердите действие