Расскажи про блокировки в Postgres.
Ответ от нейросети
sobes.tech AI
В PostgreSQL блокировки используются для обеспечения целостности данных и согласованности при одновременном доступе нескольких транзакций.
Основные типы блокировок:
-
Row-level locks (блокировки строк) — применяются для конкретных строк таблицы, позволяют другим транзакциям работать с другими строками без конфликтов. Например,
SELECT ... FOR UPDATEставит эксклюзивную блокировку на выбранные строки. -
Table-level locks (блокировки таблиц) — блокируют всю таблицу для определённых операций. Например,
LOCK TABLEпозволяет явно заблокировать таблицу. -
Advisory locks (рекомендательные блокировки) — пользовательские блокировки, которые не влияют на работу СУБД, а используются для синхронизации на уровне приложения.
Postgres использует многоуровневую систему блокировок с разными режимами (AccessShareLock, RowExclusiveLock и др.), которые совместимы или конфликтуют друг с другом.
Пример в Go с использованием database/sql:
import (
"database/sql"
_ "github.com/lib/pq"
"log"
)
func lockRow(db *sql.DB, id int) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer tx.Rollback()
// Блокируем строку с id для обновления
row := tx.QueryRow("SELECT * FROM users WHERE id=$1 FOR UPDATE", id)
// обработка row...
return tx.Commit()
}
Важно понимать, что неправильное использование блокировок может привести к дедлокам и снижению производительности, поэтому нужно тщательно проектировать логику транзакций.