Junior — Middle
Heeft u in uw projecten de opdracht SELECT FOR UPDATE gebruikt om rijen te vergrendelen tijdens transacties?
sobes.tech AI
Antwoord van AI
Ja, SELECT FOR UPDATE wordt vaak gebruikt om de geselecteerde rijen in de database te vergrendelen tijdens een transactie, om racecondities te voorkomen en de gegevensintegriteit te waarborgen.
In Go, bij het werken met databases via database/sql of ORM, kun je zo'n query uitvoeren om rijen te vergrendelen voor latere updates:
// Voorbeeld van gebruik van SELECT FOR UPDATE in 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()
}
Hier vergrendelt SELECT FOR UPDATE de rij van de gebruiker, zodat andere transacties deze niet kunnen wijzigen totdat de huidige transactie is voltooid. Dit voorkomt problemen met gelijktijdige toegang, zoals dubbele afschrijving.