Sobes.tech
Junior — Middle

Ați folosit vreodată comanda SELECT FOR UPDATE în proiectele dvs. pentru a bloca rândurile în timpul tranzacțiilor?

sobes.tech AI

Răspuns de la AI

Da, SELECT FOR UPDATE este adesea utilizat pentru a bloca rândurile selectate din bazele de date în timpul unei tranzacții, pentru a preveni condițiile de cursă și a asigura integritatea datelor.

În Go, lucrând cu baze de date prin database/sql sau ORM, puteți executa o astfel de interogare pentru a bloca rândurile pentru actualizări ulterioare:

// Exemplu de utilizare a SELECT FOR UPDATE în 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()
}

Aici, SELECT FOR UPDATE blochează rândul utilizatorului pentru ca alte tranzacții să nu îl poată modifica până când tranzacția curentă nu se finalizează. Acest lucru previne problemele de acces concurent, cum ar fi deducerile duble de fonduri.