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ů.