Sobes.tech
Junior — Middle

თქვენ თუ ოდესმე გამოიყენეთ ბრძანება SELECT FOR UPDATE თქვენს პროექტებში ხაზების ბლოკირებისთვის ტრანზაქციების დროს?

sobes.tech AI

პასუხი AI-სგან

დიახ, SELECT FOR UPDATE ხშირად გამოიყენება შერჩეული სვეტების ბლოკირებისთვის მონაცემთა ბაზაში ტრანზაქციის დროს, რათა თავიდან აიცილოს შეჯიბრის პირობები და უზრუნველყოს მონაცემების მთლიანობა.

Go-ში, მუშაობისას მონაცემთა ბაზებთან database/sql ან ORM-ის საშუალებით, შეგიძლიათ შეასრულოთ ასეთი შეკითხვა, რათა ბლოკიროთ სვეტები შემდგომი განახლებისთვის:

// მაგალითი `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()
}

აქ, SELECT FOR UPDATE ბლოკავს მომხმარებლის სვეტს, რათა სხვა ტრანზაქციებმა არ შეძლონ მისი შეცვლა მანამ, სანამ მიმდინარე ტრანზაქცია არ დასრულდება. ეს ხელს უშლის კონკურენტული წვდომის პრობლემებს, როგორიცაა დუბლირებული თანხის გამოთვლა.