Sobes.tech
Junior — Middle

Loyihalaringizda tranzaktsiyalar davomida satrlarni bloklash uchun SELECT FOR UPDATE buyruğidan foydalandingizmi?

sobes.tech AI

AIdan javob

Ha, SELECT FOR UPDATE ko'pincha tranzaksiya davomida tanlangan satrlarni bloklash uchun ishlatiladi, bu raqobat sharoitlarini oldini olish va ma'lumotlarning yaxlitligini ta'minlash uchun.

Go'da, database/sql yoki ORM orqali ma'lumotlar bazasi bilan ishlayotganda, bunday so'rovni bajarish mumkin, bu satrlarni keyingi yangilash uchun bloklash:

// Go'da SELECT FOR UPDATE dan foydalanish misoli
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()
}

Bu yerda, SELECT FOR UPDATE foydalanuvchi satrini bloklaydi, shunda boshqa tranzaksiyalar uni o'zgartira olmaydi, bu esa raqobat sharoitlarini oldini oladi.