Junior — Middle
Layihələrinizdə əməliyyatlar zamanı sətirləri kilidləmək üçün SELECT FOR UPDATE əmri istifadə etdinizmi?
sobes.tech Süni İntellekt
AI-dan cavab
Bəli, SELECT FOR UPDATE tez-tez istifadə olunur seçilmiş sətirləri tranzaksiya zamanı bloklamaq üçün, yarış şəraitlərinin qarşısını almaq və məlumatların bütövlüyünü təmin etmək üçün.
Go-da, database/sql və ya ORM vasitəsilə verilənlər bazası ilə işləyərkən, belə bir sorğu icra edə bilərsiniz, bu da sətirləri sonrakı yeniləmələr üçün bloklayır:
// Go-da `SELECT FOR UPDATE` istifadə nümunəsi
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()
}
Burada, SELECT FOR UPDATE istifadəçi sətirini bloklayır, digər tranzaksiyalar onu dəyişə bilməz, ta ki, cari tranzaksiya tamamlanana qədər. Bu, çoxsaylı giriş problemlərini, məsələn, ikiqat vəsaitin çıxarılmasını qarşısını alır.