Sobes.tech
Назад к вопросам
Junior — Middle
77

Вам приходилось применять команду SELECT FOR UPDATE в своих проектах для блокировки строк при транзакциях?

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

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

sobes.tech AI

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

В Go, при работе с базами данных через database/sql или ORM, можно выполнять такой запрос, чтобы заблокировать строки для последующего обновления:

// Пример использования SELECT FOR UPDATE в Go
func updateUserBalance(db *sql.DB, userID int, amount float64) error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }
    defer tx.Rollback()

    var balance float64
    err = tx.QueryRow("SELECT balance FROM users WHERE id = ? FOR UPDATE", userID).Scan(&balance)
    if err != nil {
        return err
    }

    newBalance := balance + amount
    _, err = tx.Exec("UPDATE users SET balance = ? WHERE id = ?", newBalance, userID)
    if err != nil {
        return err
    }

    return tx.Commit()
}

Здесь SELECT FOR UPDATE блокирует строку пользователя, чтобы другие транзакции не могли её изменить до завершения текущей транзакции. Это предотвращает проблемы с конкурентным доступом, например, двойное списание средств.