Почему некоторые связи проверяют в конце транзакции

Несколько связанных изменений могут временно нарушать правило, хотя итог согласован. Объясняем отложенную проверку ограничений PostgreSQL без команд и запросов.

Соединённые оранжевое и графитовое керамические звенья на светлой подставке и стеклянная линза позади готовой пары.

Правильный итог может состоять из нескольких шагов

Представим условную систему учебных проектов. В карточке проекта указан ответственный сотрудник, а в карточке сотрудника — основной проект. Правило требует, чтобы обе ссылки указывали на существующие записи. При создании новой пары возникает вопрос порядка: какую карточку сохранить первой, если она уже должна ссылаться на вторую? Проблема относится к моменту проверки связей.

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

Ограничение задаёт допустимое состояние

Ограничением называют правило, которое база данных проверяет при изменениях. Для связи между карточками смысл может быть таким: нельзя ссылаться на несуществующий проект. В документации PostgreSQL 18 о времени проверки различаются проверки после отдельного действия и проверки, отложенные до фиксации транзакции. Здесь рассматривается именно поведение этой системы.

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

Отложить проверку не значит отменить её

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

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

Не каждое правило допускает ожидание

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

Поэтому рекомендация «проверьте всё в конце» неверна. Сначала нужно выяснить, какое правило мешает промежуточному шагу, допускает ли оно откладывание и разумно ли устройство связанных данных. Иногда вопрос решается изменением порядка действий или самой модели. Возможность отложенной проверки не делает всякую взаимную зависимость удобной для дальнейшего сопровождения.

Ошибка может обнаружиться позже привычного

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

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

Как изучать механизм без сложного синтаксиса

Нарисуйте две карточки и словами опишите требуемый итог. Затем перечислите промежуточные состояния и отметьте, какое правило в каждом из них ещё не выполнено. Такой разбор помогает сформулировать вопрос к разработчику базы. Для дальнейшего изучения ограничений и транзакций посмотрите программу «SQL инженер». Практические настройки следует проверять по документации используемой системы и её версии.

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

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

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

Источники

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

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

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

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

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

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

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

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

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

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

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