Транзакция в базе данных: зачем сохранять изменения вместе

Объясняем транзакции на примере записи на занятие: что происходит при сбое, зачем нужен откат и почему одной транзакции недостаточно для всех задач.

Два графитовых блока соединены оранжевым мостом внутри общего прозрачного корпуса

Одна запись — несколько изменений

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

Если сохранить только часть результата, возникнет путаница. Ученик увидит подтверждение, а место по-прежнему будет считаться свободным. Или место исчезнет, хотя участника в списке нет. Транзакция помогает задать границу: какие изменения должны пройти вместе. Это полезный принцип даже для человека, который пока не пишет программы.

Что называют транзакцией

Транзакция объединяет работу с базой данных в одну логическую операцию. Для включённых в неё изменений действует принцип «всё или ничего»: успешно завершённая операция фиксируется, а при отмене её изменения не становятся сохранённым результатом. Это свойство называют атомарностью.

В документации PostgreSQL транзакции описаны именно как способ объединять отдельные шаги. Здесь важно слово «объединять»: база не угадывает, что запись ученика и изменение количества мест относятся к одному действию. Границы задаёт разработчик. Если связанные изменения выполняются отдельно, само наличие поддержки транзакций не исправит эту ошибку проектирования.

Подробнее: PostgreSQL: принцип транзакций.

Фиксация и откат на понятном примере

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

Откат незавершённой операции отличается от отмены уже подтверждённой записи. Если ученик передумал на следующий день, понадобится новое действие по правилам школы: убрать участника и освободить место. Пользовательская кнопка «Отменить запись» и внутренний откат транзакции могут выглядеть похоже по результату, но относятся к разным ситуациям. Такое различие помогает точнее описывать требования к системе.

А если на последнее место претендуют двое

Теперь предположим, что два человека открыли запись одновременно. Оба успели увидеть одно свободное место. Как системе согласовать их действия? Здесь становится важна изоляция — правила того, как параллельные транзакции взаимодействуют и какие изменения видят.

Уровни изоляции дают разные гарантии. PostgreSQL отдельно описывает, какие ситуации возможны при каждом уровне; при строгом режиме приложение должно быть готово к отказу одной из конфликтующих операций и повторной попытке. Поэтому фраза «у нас есть транзакция» ещё не доказывает, что последнее место нельзя продать дважды. Нужны корректные правила записи, ограничения данных и обработка конфликтов.

Подробнее: PostgreSQL: уровни изоляции.

Где заканчивается её действие

Полезно заранее разделить запись в базе и сопутствующие действия. Например, после регистрации школа хочет отправить письмо. Для разбора представим, что список участников сохраняет одна система, а письма отправляет другая. Это уже две части процесса с собственной логикой.

Нельзя автоматически обещать пользователю, что отмена изменений в первой системе отзовёт уже отправленное сообщение во второй. На обсуждении продукта стоит отдельно спросить: когда отправляется подтверждение, что произойдёт при его задержке и как человек проверит статус записи? Это вопросы к устройству конкретного приложения. Одна надпись «транзакция» в техническом описании не заменяет ответов на них.

Что полезно запомнить начинающему

Транзакция нужна там, где частичный результат внутри базы недопустим. Чтобы заметить такую задачу, попробуйте описать привычный сервис словами. Что изменяется при бронировании? Какие сведения должны оставаться согласованными? Как выглядит успешный результат? Что должен увидеть человек, если операция не закончилась?

Для учебного разбора достаточно схемы на бумаге: исходное состояние, связанные изменения и два исхода — сохранение или отмена. Затем отдельно рассмотрите одновременные действия двух людей. Так понятие перестаёт быть абстрактным термином и превращается в способ обсуждать надёжность сервиса. Синтаксис можно изучать позже, когда понятна задача, ради которой он существует.

Читайте также

Обучение в NovaData

Если хотите системно разобраться в этом направлении, посмотрите программу «SQL инженер». Сопоставьте содержание и требования к подготовке со своими задачами.

SQL инженер
Курс
Доступ сразу
SQL инженер

SQL инженер — это специалист, который работает с базами данных, разрабатывает запросы, оптимизирует хранение данных и обеспечивает эффективную работу с информацией в компаниях.

С нуля до junior
Теория и практика
Диплом по окончании
500
₽/мес
УЗНАТЬ ПОДРОБНЕЕ

Источники

Читайте также

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

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

Как руководителю определить, какие навыки развивать внутри команды, когда нужна новая роль и почему обучение и найм часто дополняют друг друга.
Вертикальное и горизонтальное масштабирование данных: в чём разница
46

Вертикальное и горизонтальное масштабирование данных: в чём разница

Когда системе добавляют мощность одного сервера, когда делят работу между несколькими и почему увеличение ресурсов само по себе не решает любую проблему.
Журнал изменений данных: как выяснить, кто и когда изменил набор
42

Журнал изменений данных: как выяснить, кто и когда изменил набор

Что можно узнать из журнала действий с данными, как он помогает разбирать ошибки и почему его записи не показывают всю историю сами по себе.

Занятия проходят
в Нова Дата СДО

Вебинары, практика и общение с преподавателем — в одном окне браузера.

Посмотреть интерфейс платформы
Календарь обучения в Нова Дата СДО
Курсы студента в Нова Дата СДО
Редактор кода для практики в Нова Дата СДО
Вебинары и расписание Ваши курсы Код в браузере
Нова Дата СДО — в реестре российского ПОРеестровая запись № 34931
Заявка отправлена
Отправим вам подборку курсов в течение 5 минут. С вами также свяжется наш специалист и даст карьерную консультацию.
Персональный промокод
На курс «Инженер по парсингу данных»
Введите код при оплате, чтобы применить скидку к программе.