Junior — Middle
Hai mai usato il comando SELECT FOR UPDATE nei tuoi progetti per bloccare le righe durante le transazioni?
sobes.tech AI
Risposta dell'AI
Sì, SELECT FOR UPDATE viene spesso utilizzato per bloccare le righe selezionate nel database durante una transazione, per prevenire condizioni di gara e garantire l'integrità dei dati.
In Go, lavorando con database tramite database/sql o ORM, è possibile eseguire tale query per bloccare le righe per un successivo aggiornamento:
// Esempio di utilizzo di 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()
}
Qui, SELECT FOR UPDATE blocca la riga dell'utente in modo che altre transazioni non possano modificarla fino al completamento di quella corrente. Questo previene problemi di accesso concorrente, come doppia deduzione dei fondi.