> Для чего используется SELECT FOR UPDATE? (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: InDrive
Стек: Go
> Пример ответа
SELECT FOR UPDATE используется в Go (и в SQL в целом) для блокировки выбранных строк на время транзакции. Это необходимо для предотвращения состояний гонки (race conditions) при конкурентном доступе к данным. Например, при реализации очередей задач или обработке заказов: один процесс читает запись, блокирует её, обрабатывает, а другие процессы не могут прочитать ту же запись до завершения транзакции.
В 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 introws.Scan(&id, ...)tx.Exec("UPDATE tasks SET status = 'processing' WHERE id = $1", id)}tx.Commit()
Без FOR UPDATE два параллельных запроса могут прочитать одну и ту же строку, что приведёт к дублированию обработки. Важно помнить, что блокировка снимается только при завершении транзакции (COMMIT или ROLLBACK), и она работает только в поддерживающих блокировки СУБД (PostgreSQL, MySQL/InnoDB, Oracle).
> Похожие задачи по Go
Что такое живая зона памяти в Go?
За счет чего достигается durability в PostgreSQL?
Приходилось ли менять уровни изоляции транзакций?
Что делать, если после добавления индекса селективность низкая и запрос остается медленным?
> Похожие задачи по backend
Что такое живая зона памяти в Go?
За счет чего достигается durability в PostgreSQL?
Приходилось ли менять уровни изоляции транзакций?
Что делать, если после добавления индекса селективность низкая и запрос остается медленным?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью