Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 239новых вакансий за сутки·75 016вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании6 548
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 400 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python14 623
  • Облачные технологии10 965
  • QA вакансии3 255
  • Backend вакансии1 723
  • Инженер данных1 270
  • Продакт-менеджер586

Разработка

  • Android1 706
  • iOS1 579
  • AI вакансии822
  • Fullstack вакансии697
  • Frontend вакансии598
  • Mobile вакансии30

По стеку

  • Go8 025
  • Java5 176
  • Node.js1 637
  • Kotlin1 393
  • Rust1 331
  • .NET1 254
  • PHP541
  • C++384
  • C#352

DevOps и инфраструктура

  • Kubernetes6 272
  • Linux-инфраструктура4 763
  • DevOps вакансии4 564
  • Terraform / IaC3 459
  • Мониторинг и Observability1 587
  • CI/CD1 478
  • SRE458
  • Кибербезопасность127

Аналитика и данные

  • Аналитик данных683
  • Бизнес-аналитик638
  • Data Scientist622
  • Системный аналитик92

Другие направления

  • Проджект-менеджер202
  • UI/UX дизайн93
  • Ручное тестирование14

По регионам

  • Вакансии в США34 823
  • Вакансии в Европе15 244
  • Работа в России3 882
  • Вакансии в Канаде3 408

По формату

  • Удалённые вакансии54 624
  • Релокация в США34 823
  • Гибридная работа9 269
  • Офисная работа6 545

По уровню

  • Senior вакансии33 244
  • Middle вакансии15 490
  • Junior вакансии5 355

Сейчас нанимают

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме PostgreSQLВсе вопросы
PostgreSQLMiddleТеория

Что такое MVCC (Multi-Version Concurrency Control) и как PostgreSQL его реализует?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

MVCC хранит несколько версий каждой строки через поля xmin/xmax; каждая транзакция видит снимок базы на момент старта, что позволяет читателям не блокировать писателей. Мёртвые версии удаляет VACUUM.

Системные колонки

Каждая строка в PostgreSQL содержит скрытые служебные поля:

  • xmin — ID транзакции, создавшей эту версию строки.
  • xmax — ID транзакции, удалившей или обновившей строку (0 = строка актуальна).
  • ctid — физический адрес строки (блок, смещение).
SELECT ctid, xmin, xmax, id, name
FROM users
WHERE id = 1;
-- ctid=(0,1)  xmin=100  xmax=0  -- актуальная строка

-- После UPDATE:
-- старая версия: xmax = 102 (транзакция обновления)
-- новая версия:  xmin = 102, xmax = 0, ctid=(0,5)

MVCC в PostgreSQL

MVCC (Multi-Version Concurrency Control) — механизм управления конкурентным доступом без традиционных блокировок чтения. Вместо блокировки читателей при записи PostgreSQL создаёт новые версии строк. Каждая транзакция видит снимок (snapshot) базы данных, актуальный на момент её начала.

Как работает снимок

При старте транзакции PostgreSQL фиксирует:

  • xmin снимка — минимальный активный XID; все транзакции ниже завершены.
  • xmax снимка — следующий XID, который будет выдан; всё выше невидимо.
  • список активных транзакций — их изменения тоже невидимы.

Строка видима транзакции, если:

  • xmin строки завершён и не в списке активных.
  • xmax строки = 0, или транзакция xmax ещё не завершена, или она в списке активных.

Уровни изоляции

-- READ COMMITTED (по умолчанию): снимок обновляется на каждый запрос
BEGIN;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- каждый SELECT видит свежие зафиксированные данные
COMMIT;

-- REPEATABLE READ: снимок фиксируется при первом запросе транзакции
BEGIN;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- повторный SELECT вернёт те же данные, даже если другая транзакция закоммитила изменения
COMMIT;

-- SERIALIZABLE: полная сериализуемость через SSI (Serializable Snapshot Isolation)
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- PostgreSQL отслеживает зависимости между транзакциями
-- при конфликте откатывает одну из них с ERROR 40001
COMMIT;

Table Bloat и VACUUM

UPDATE не изменяет строку на месте, а создаёт новую версию. Старые версии («мёртвые кортежи») накапливаются и занимают место. VACUUM освобождает их, VACUUM FULL перезаписывает таблицу (блокирует!).

-- Посмотреть мёртвые кортежи
SELECT relname, n_dead_tup, n_live_tup, last_autovacuum
FROM pg_stat_user_tables
ORDER BY n_dead_tup DESC;

-- Ручной VACUUM
VACUUM ANALYZE users;

-- Настройка autovacuum для горячей таблицы
ALTER TABLE orders SET (
    autovacuum_vacuum_scale_factor = 0.01,  -- вместо 0.2 (20%)
    autovacuum_analyze_scale_factor = 0.005
);

Transaction ID Wraparound

XID — 32-битное число, исчерпывается примерно через 4 млрд транзакций. VACUUM «замораживает» старые строки, устанавливая их xmin в FrozenTransactionId (2), чтобы они были видимы всем. Без регулярного VACUUM база рискует уйти в аварийный режим.

-- Проверить расстояние до wraparound
SELECT datname,
       age(datfrozenxid) AS xid_age,
       2^31 - age(datfrozenxid) AS xids_remaining
FROM pg_database
ORDER BY xid_age DESC;

Подводные камни

  • Долгие транзакции удерживают снимок и не дают VACUUM убрать старые версии строк — таблица раздувается. Мониторьте pg_stat_activity и idle in transaction.
  • XID Wraparound: если age(datfrozenxid) приближается к 1.5–2 млрд, PostgreSQL начинает выдавать предупреждения, а при 2 млрд уходит в режим «только VACUUM». Настройте мониторинг.
  • VACUUM FULL перезаписывает таблицу с AccessExclusiveLock — используйте pg_repack в продакшене для неблокирующей дефрагментации.
  • При уровне READ COMMITTED одна транзакция может видеть разные снимки в разных командах — это исключает phantom reads только при REPEATABLE READ.
  • Оптимистичная блокировка через xmin ненадёжна: VACUUM freeze меняет xmin на константу, и ваша проверка WHERE xmin = old_xmin перестаёт работать корректно.
  • SERIALIZABLE работает через SSI и добавляет overhead отслеживания зависимостей; при ошибке 40001 приложение обязано перезапускать транзакцию.
  • Hot standby реплики используют те же снимки: долгий запрос на реплике тоже удерживает cleanup-горизонт через hot_standby_feedback.

Типичные ошибки

  • Отвечать про реализация mvcc как про абстрактный SQL без учета MVCC, WAL, planner или конкретной версии PostgreSQL.
  • Переносить поведение MySQL или ClickHouse на PostgreSQL без проверки документации.
  • Не связывать механизм с последствиями для индексов, транзакций, блокировок или эксплуатации.
  • Показывать синтаксис, который не поддерживается PostgreSQL.

Что проверяет интервьюер

  • Кандидат объясняет реализация mvcc через реальный механизм PostgreSQL, а не общими словами.
  • Приводит корректный SQL или диагностический запрос для этой СУБД.
  • Называет ограничения, версионные отличия или эксплуатационные последствия.
  • Связывает ответ с проектированием приложения, производительностью, надежностью или безопасностью.

Как вы знаете этот вопрос?

Проверить себя по теме PostgreSQL →

Источники

  • https://www.postgresql.org/docs/current/mvcc-intro.html
  • https://www.postgresql.org/docs/current/transaction-iso.html
←Предыдущий вопросЧто такое PostgreSQL и каковы его ключевые преимущества перед другими реляционными СУБД?Следующий вопрос→В чём разница между `INNER JOIN`, `LEFT JOIN`, `RIGHT JOIN` и `FULL OUTER JOIN`?

Связанные темы

PostgreSQLconcurrency-controlquery-debugging

Вакансии с этим навыком

PostgreSQL вакансии
  • Middle Full-Stack Developer (C#/.NET)
  • Middle Full-Stack разработчик (C#/.NET)
  • DevOps Engineer
  • Senior Software Engineer
  • Lead Cloud Engineer (Azure) — Interview Experts Needed (#5499)

Частые вопросы на собеседовании

  • Что делает VACUUM, VACUUM FULL, ANALYZE? Чем они отличаются и какой когда применять?
  • Какие уровни изоляции есть и чем отличаются (READ COMMITTED, REPEATABLE READ, SERIALIZABLE)? Какой по умолчанию в Postgres?
  • Что такое PITR и чем pg_dump отличается от base backup + WAL archive?
  • Каковы типы индексов в PostgreSQL (B-tree, Hash, GIN, GiST, BRIN)?