Назад к вопросам
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 {
// обработка ошибки
}
Таким образом, строка будет заблокирована на время транзакции, что предотвращает гонки при параллельных обновлениях.