Junior — Middle
Vai jūs kādreiz esat izmantojis SELECT FOR UPDATE komandu savos projektos, lai bloķētu rindas transakciju laikā?
sobes.tech AI
Atbilde no AI
Jā, SELECT FOR UPDATE bieži tiek izmanto, lai bloķētu atlasītās rindas datu bāzē transakcijas laikā, lai novērstu sacensību apstākļus un nodrošinātu datu integritāti.
Go valodā, strādājot ar datu bāzēm caur database/sql vai ORM, var izpildīt šādu vaicājumu, lai bloķētu rindas turpmākai atjaunināšanai:
// Piemērs, kā izmantot `SELECT FOR UPDATE` 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()
}
Šeit SELECT FOR UPDATE bloķē lietotāja rindu, lai citas transakcijas to nevarētu mainīt līdz brīdim, kad pašreizējā transakcija tiks pabeigta. Tas novērš konkurences problēmas, piemēram, dubultu līdzekļu izņemšanu.