Sobes.tech
Junior — Middle

Použili jste někdy příkaz SELECT FOR UPDATE ve svých projektech k zámku řádků během transakcí?

sobes.tech AI

Odpověď od AI

Ano, příkaz SELECT FOR UPDATE se často používá k zámku vybraných řádků v databázi během transakce, aby se zabránilo závodním podmínkám a zajistila integrita dat.

V Go, při práci s databázemi přes database/sql nebo ORM, můžete takový dotaz spustit, aby zamkl řádky pro následnou aktualizaci:

// Příklad použití `SELECT FOR UPDATE` v 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()
}

Zde SELECT FOR UPDATE zamkne řádek uživatele, takže jiné transakce ho nemohou změnit, dokud se aktuální transakce nedokončí. To zabraňuje problémům s konkurenčním přístupem, například duplicitnímu odečtu prostředků.