Junior — Middle
Haben Sie in Ihren Projekten die Anweisung SELECT FOR UPDATE verwendet, um Zeilen während Transaktionen zu sperren?
sobes.tech KI
Antwort von AI
Ja, SELECT FOR UPDATE wird häufig verwendet, um die ausgewählten Zeilen in der Datenbank während einer Transaktion zu sperren, um Race Conditions zu verhindern und die Datenintegrität zu gewährleisten.
In Go, bei der Arbeit mit Datenbanken über database/sql oder ORM, kann man eine solche Abfrage ausführen, um Zeilen für eine spätere Aktualisierung zu sperren:
// Beispiel für die Verwendung von 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 sperrt SELECT FOR UPDATE die Zeile des Benutzers, sodass andere Transaktionen sie nicht ändern können, bis die aktuelle Transaktion abgeschlossen ist. Dies verhindert Probleme bei gleichzeitiger Nutzung, wie doppelte Abzüge.