Блокировки в базе данных: почему приходится ждать

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

Две дорожки с фишками сходятся к одной карточке, защищённой оранжевым замком.

Два человека меняют одну запись

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

Блокировка — временное ограничение на несовместимые действия с данными или их структурой. Она определяет, кто сейчас может выполнить определённое действие, а кому нужно дождаться освобождения ресурса. Слово «блокировка» звучит как поломка, но ожидание нередко является частью нормальной работы базы.

Что именно оказывается занято

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

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

Условный пример последовательности

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

Если первое изменение успешно завершится, система сможет продолжить второе действие с учётом правил приложения и базы. Если первое будет отменено, незавершённый перенос не должен превращаться в подтверждённую бронь. Сама блокировка не решает бизнес-вопрос: вправе ли второй сотрудник менять уже перенесённую встречу. Это отдельное правило приложения.

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

Почему чтение устроено иначе

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

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

Почему короткая работа тоже может долго ждать

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

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

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

Вопросы, которые помогают разобраться

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

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

Как перейти к практике

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

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

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

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

Что почитать рядом

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

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

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

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

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

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

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

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

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

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

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

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