Ответ
В Golang при работе с БД часто используются следующие типы блокировок:
- Эксклюзивные (X-lock) - запрещают другим транзакциям читать/изменять данные. Используются при записи.
BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;
-- изменение данных
COMMIT;
- Разделяемые (S-lock) - разрешают чтение, но запрещают изменение. Используются при чтении:
SELECT * FROM accounts WHERE id = 1 LOCK IN SHARE MODE;
- Оптимистичные - проверяют версию записи перед изменением:
var version int
err := db.QueryRow("SELECT version FROM accounts WHERE id = 1").Scan(&version)
// проверка version перед обновлением
- Пессимистичные - блокируют запись сразу при SELECT.
Также существуют блокировки на уровне таблиц, строк и страниц. В Postgres есть advisory locks для гибкой блокировки.