Sobes.tech
Junior — Middle

Ar kada nors naudojote SELECT FOR UPDATE komandą savo projektuose eilių užrakinimui transakcijų metu?

sobes.tech AI

Atsakymas iš AI

Taip, SELECT FOR UPDATE dažnai naudojama norint užblokuoti pasirinktus įrašus duomenų bazėje transakcijos metu, siekiant išvengti lenktynių sąlygų ir užtikrinti duomenų vientisumą.

Go kalboje, dirbant su duomenų bazėmis per database/sql arba ORM, galima vykdyti tokį užklausą, kad užblokuotumėte įrašus vėlesniam atnaujinimui:

// Pavyzdys, kaip naudoti `SELECT FOR UPDATE` Go kalboje
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()
}

Čia SELECT FOR UPDATE užrakina naudotojo įrašą, kad kitos transakcijos jo keisti negalėtų iki kol dabartinė transakcija nebus baigta. Tai padeda išvengti konkurencinių problemų, tokių kaip dvigubas lėšų išskaidymas.