> Для чего используется SELECT FOR UPDATE? (Go)

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

Компании: InDrive

Стек: Go

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

SELECT FOR UPDATE используется в Go (и в SQL в целом) для блокировки выбранных строк на время транзакции. Это необходимо для предотвращения состояний гонки (race conditions) при конкурентном доступе к данным. Например, при реализации очередей задач или обработке заказов: один процесс читает запись, блокирует её, обрабатывает, а другие процессы не могут прочитать ту же запись до завершения транзакции.

В 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
rows.Scan(&id, ...)
tx.Exec("UPDATE tasks SET status = 'processing' WHERE id = $1", id)
}
tx.Commit()

Без FOR UPDATE два параллельных запроса могут прочитать одну и ту же строку, что приведёт к дублированию обработки. Важно помнить, что блокировка снимается только при завершении транзакции (COMMIT или ROLLBACK), и она работает только в поддерживающих блокировки СУБД (PostgreSQL, MySQL/InnoDB, Oracle).

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

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