Sobes.tech
Назад к вопросам
Middle+
3

Как заблокировать строку в БД для атомарного обновления?

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

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

sobes.tech AI

Для атомарного обновления строки в базе данных часто используют блокировку на уровне строки. В SQL это достигается с помощью конструкции SELECT ... FOR UPDATE, которая блокирует выбранные строки до завершения транзакции.

В Go с использованием пакета database/sql можно сделать так:

// Начинаем транзакцию
tx, err := db.Begin()
if err != nil {
    // обработка ошибки
}

// Блокируем строку для обновления
row := tx.QueryRow("SELECT balance FROM accounts WHERE id = ? FOR UPDATE", accountId)

var balance int
err = row.Scan(&balance)
if err != nil {
    tx.Rollback()
    // обработка ошибки
}

// Выполняем обновление
_, err = tx.Exec("UPDATE accounts SET balance = ? WHERE id = ?", balance+amount, accountId)
if err != nil {
    tx.Rollback()
    // обработка ошибки
}

// Фиксируем транзакцию
err = tx.Commit()
if err != nil {
    // обработка ошибки
}

Таким образом, строка будет заблокирована на время транзакции, что предотвращает гонки при параллельных обновлениях.