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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python5 973
  • Облачные технологии4 523
  • QA вакансии1 689
  • Android1 143
  • Инженер данных788
  • Продакт-менеджер308

Разработка

  • iOS1 093
  • Backend вакансии1 020
  • Fullstack вакансии448
  • AI вакансии378
  • Frontend вакансии369
  • Mobile вакансии27

По стеку

  • Go3 345
  • Java2 037
  • Kotlin908
  • Node.js746
  • Rust492
  • .NET481
  • PHP278
  • C++213
  • C#199

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

  • Kubernetes2 562
  • Linux-инфраструктура2 030
  • DevOps вакансии1 855
  • Terraform / IaC1 548
  • CI/CD876
  • Мониторинг и Observability709
  • SRE229
  • Кибербезопасность40

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

  • Аналитик данных479
  • Data Scientist443
  • Бизнес-аналитик342
  • Системный аналитик50

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

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

По регионам

  • Вакансии в США24 039
  • Вакансии в Европе9 373
  • Работа в России2 968
  • Вакансии в Канаде2 114

По формату

  • Удалённые вакансии41 595
  • Релокация в США24 039
  • Гибридная работа5 209
  • Офисная работа3 834

По уровню

  • Senior вакансии22 591
  • Middle вакансии12 174
  • Junior вакансии4 013

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

Все компании
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise81 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify17 вакансий
  • Celonis14 вакансий
  • UiPath13 вакансий
  • Adyen9 вакансий

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

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

Как возникают deadlocks и как PostgreSQL с ними справляется?

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

Дедлок возникает при циклическом ожидании блокировок; PostgreSQL обнаруживает цикл через wait-for graph и откатывает транзакцию-жертву с ошибкой SQLSTATE 40P01, которую приложение должно перехватывать и повторять.

Что такое дедлок и почему он возникает

Дедлок (взаимная блокировка) возникает, когда два или более транзакции ждут друг друга в цикле: транзакция A держит блокировку на ресурсе 1 и ждёт ресурс 2, а транзакция B держит блокировку на ресурсе 2 и ждёт ресурс 1. Ни одна из них не может продолжить выполнение без того, чтобы другая освободила свой ресурс.

Типичный сценарий — два UPDATE на одни и те же строки в разном порядке:

-- Транзакция A
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
-- ждёт, пока транзакция B отпустит id=2
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- Транзакция B (одновременно)
BEGIN;
UPDATE accounts SET balance = balance - 50 WHERE id = 2;
-- ждёт, пока транзакция A отпустит id=1
UPDATE accounts SET balance = balance + 50 WHERE id = 1;

Как PostgreSQL обнаруживает дедлоки

PostgreSQL использует алгоритм обнаружения циклов в графе ожидания (wait-for graph). Фоновый процесс проверяет граф с интервалом, заданным параметром deadlock_timeout (по умолчанию 1 с). Если цикл обнаружен, PostgreSQL выбирает одну транзакцию-«жертву» (обычно самую «дешёвую» для отката) и отменяет её с ошибкой:

ERROR:  deadlock detected
DETAIL:  Process 12345 waits for ShareLock on transaction 67890;
         blocked by process 11111.
HINT:   See server log for query details.

Транзакция-жертва получает rollback; другие могут продолжить работу. Событие также логируется в pg_log на уровне LOG.

Как найти и диагностировать дедлоки

Включите логирование дедлоков в postgresql.conf:

log_lock_waits = on
deadlock_timeout = 1s
log_min_duration_statement = 0

Просмотр активных ожиданий в реальном времени:

SELECT
  pid,
  wait_event_type,
  wait_event,
  state,
  query
FROM pg_stat_activity
WHERE wait_event_type = 'Lock';

-- Детальный граф блокировок
SELECT
  blocked.pid          AS blocked_pid,
  blocking.pid         AS blocking_pid,
  blocked.query        AS blocked_query,
  blocking.query       AS blocking_query
FROM pg_stat_activity AS blocked
JOIN pg_stat_activity AS blocking
  ON blocking.pid = ANY(pg_blocking_pids(blocked.pid))
WHERE cardinality(pg_blocking_pids(blocked.pid)) > 0;

Стратегии предотвращения дедлоков

1. Единый порядок захвата ресурсов — всегда обрабатывайте строки в одном порядке (например, ORDER BY id):

-- Вместо произвольного порядка — сортируем id
UPDATE accounts
SET balance = balance + delta
WHERE id = ANY(ARRAY[1, 2, 3]::int[])
  AND id IN (SELECT id FROM unnest(ARRAY[1, 2, 3]::int[]) AS t(id) ORDER BY id)
RETURNING id, balance;

2. SELECT FOR UPDATE SKIP LOCKED — позволяет пропускать заблокированные строки вместо ожидания:

SELECT id FROM jobs
WHERE status = 'pending'
ORDER BY id
LIMIT 10
FOR UPDATE SKIP LOCKED;

3. ADVISORY LOCKS — явный захват логических замков на уровне приложения:

SELECT pg_advisory_xact_lock(hashtext('transfer:' || least(1,2)::text));
SELECT pg_advisory_xact_lock(hashtext('transfer:' || greatest(1,2)::text));

4. Уменьшение времени транзакций — чем короче транзакция, тем меньше вероятность пересечения с другой.

Обработка на стороне приложения

Дедлоки неизбежны при высокой конкурентности, поэтому приложение должно уметь их retry. PostgreSQL возвращает SQLSTATE 40P01:

from psycopg2 import OperationalError
import time

def transfer_with_retry(conn, from_id, to_id, amount, retries=3):
    for attempt in range(retries):
        try:
            with conn.transaction():
                conn.execute(
                    "UPDATE accounts SET balance = balance - %s WHERE id = %s",
                    (amount, from_id)
                )
                conn.execute(
                    "UPDATE accounts SET balance = balance + %s WHERE id = %s",
                    (amount, to_id)
                )
            return
        except OperationalError as e:
            if e.pgcode == '40P01' and attempt < retries - 1:
                time.sleep(0.05 * (attempt + 1))
                continue
            raise

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

  • Увеличение deadlock_timeout снижает нагрузку на обнаружение, но увеличивает латентность при реальных дедлоках — баланс нужно подбирать под нагрузку.
  • ORM-фреймворки (SQLAlchemy, Django ORM) часто скрывают порядок UPDATE: при batch-операциях он может быть недетерминированным.
  • Дедлоки и обычные lock-waits — разные вещи: lock_waits — это очередь, дедлок — цикл. log_lock_waits помогает найти и то и другое, но симптомы разные.
  • Использование SELECT ... FOR UPDATE без ORDER BY в конкурентной среде почти гарантирует дедлоки при параллельных запросах на одном наборе строк.
  • TRUNCATE и DDL-операции берут более сильные блокировки (AccessExclusiveLock), что может неожиданно создать дедлок с обычными DML-транзакциями.
  • Retry без exponential backoff создаёт thundering herd — все конкурирующие транзакции снова сталкиваются одновременно.
  • Advisory locks не освобождаются автоматически при сбое соединения в некоторых драйверах — нужно явно вызывать pg_advisory_unlock_all().

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

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

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

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

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

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

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

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

Источники

  • https://www.postgresql.org/docs/current/explicit-locking.html#LOCKING-DEADLOCKS

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

PostgreSQLincident-debuggingtransaction-design

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

PostgreSQL вакансии
  • Vice Senior Manager/Group Manager - Database Section, Cloud Services Department (CLSD)
  • Infrastructure Architect, Corporate IT - Global Architecture Section, Global IT Strategy Office (GITSO)
  • Data Engineer - FMCG Customer Strategy Section, FMCG Customer Strategy Department (C&M)
  • Senior Manager - Database Section, Cloud Services Department (CLSD)
  • Infrastructure Engineer, Modernization Lead (Manager Candidate) - IT Division, Rakuten Securities, Inc.(Secondment)