Какие знаешь опции для SELECT FOR UPDATE

«Какие знаешь опции для SELECT FOR UPDATE» — вопрос из категории Базы данных, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Go при использовании SELECT FOR UPDATE с database/sql и драйверами вроде pgx или pq для PostgreSQL, доступны такие опции:

  1. NOWAIT – если запись заблокирована, сразу возвращает ошибку вместо ожидания:
    SELECT * FROM table WHERE id = 1 FOR UPDATE NOWAIT
  1. SKIP LOCKED – пропускает заблокированные строки:
    SELECT * FROM table WHERE id = 1 FOR UPDATE SKIP LOCKED
  1. OF column(s) – уточняет, какие именно столбцы блокировать:
    SELECT * FROM table WHERE id = 1 FOR UPDATE OF column1, column2
  1. FOR NO KEY UPDATE – более слабая блокировка, не затрагивающая индексы:
    SELECT * FROM table WHERE id = 1 FOR NO KEY UPDATE

В Go пример с pgx:

row := conn.QueryRow(ctx, "SELECT * FROM orders WHERE id = $1 FOR UPDATE NOWAIT", orderID)