Sobes.tech
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.