Sobes.tech
Назад к вопросам
Senior
4

Расскажи про блокировки в Postgres.

Компании, где спрашивали
FREEDOM LIFESTYLE

Ответ от нейросети

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()
}

Важно понимать, что неправильное использование блокировок может привести к дедлокам и снижению производительности, поэтому нужно тщательно проектировать логику транзакций.