> Для чего нужен FOR UPDATE в PostgreSQL (Go, PostgreSQL)
Уровень: senior · Роль: backend · Категория: Технические вопросы
Компании: Ozon, Lamoda
Стек: Go, PostgreSQL
> Пример ответа
FOR UPDATE в PostgreSQL используется для блокировки выбранных строк при выполнении запроса SELECT. Это часть механизма управления конкурентным доступом (MVCC), которая предотвращает изменение или удаление этих строк другими транзакциями до завершения текущей.
В контексте Go и PostgreSQL это критично для сценариев, где нужно гарантировать целостность данных при параллельных запросах. Например, при реализации очереди задач или инвентаризации: вы выбираете строку для обработки и блокируете её, чтобы другой воркер не взял ту же задачу.
Пример на Go с использованием database/sql:
GOtx, err := db.Begin()if err != nil { /* обработка */ }defer tx.Rollback()rows, err := tx.Query("SELECT id, status FROM tasks WHERE status = 'pending' LIMIT 1 FOR UPDATE")if err != nil { /* обработка */ }defer rows.Close()if rows.Next() {var id intvar status stringrows.Scan(&id, &status)// Обновляем статус, чтобы другие не забралиtx.Exec("UPDATE tasks SET status = 'processing' WHERE id = $1", id)}tx.Commit()
Без FOR UPDATE две параллельные горутины могли бы прочитать одну и ту же строку, что привело бы к дублированию обработки. Блокировка снимается при завершении транзакции (COMMIT или ROLLBACK). Важно помнить, что FOR UPDATE работает только внутри транзакции и может вызывать взаимные блокировки (deadlocks) при неправильном порядке блокировок.
> Похожие задачи по backend
Назови примеры метрик для алертов
Есть ли у вас мониторинг и на каком стеке он работает
Какие состояния могут быть у горутин в Go
Каковы преимущества и недостатки индексов в базе данных
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью