> Для чего нужен FOR UPDATE в PostgreSQL (Go, PostgreSQL)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Ozon, Lamoda

Стек: Go, PostgreSQL

> Пример ответа

FOR UPDATE в PostgreSQL используется для блокировки выбранных строк при выполнении запроса SELECT. Это часть механизма управления конкурентным доступом (MVCC), которая предотвращает изменение или удаление этих строк другими транзакциями до завершения текущей.

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

Пример на Go с использованием database/sql:

GO
tx, 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 int
var status string
rows.Scan(&id, &status)
// Обновляем статус, чтобы другие не забрали
tx.Exec("UPDATE tasks SET status = 'processing' WHERE id = $1", id)
}
tx.Commit()

Без FOR UPDATE две параллельные горутины могли бы прочитать одну и ту же строку, что привело бы к дублированию обработки. Блокировка снимается при завершении транзакции (COMMIT или ROLLBACK). Важно помнить, что FOR UPDATE работает только внутри транзакции и может вызывать взаимные блокировки (deadlocks) при неправильном порядке блокировок.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью