Sobes.tech
Junior — Middle

Da li ste ikada koristili komandu SELECT FOR UPDATE u svojim projektima za zaključavanje redova tokom transakcija?

sobes.tech АИ

Одговор од АИ

Da, SELECT FOR UPDATE često se koristi za zaključavanje odabranih redova u bazi podataka tokom transakcije, kako bi se sprečili uslovi trke i obezbedila integritet podataka.

U Go, radeći sa bazama podataka putem database/sql ili ORM, možete izvršiti takav upit da zaključate redove za kasniju ažuriranje:

// Primer korišćenja `SELECT FOR UPDATE` u 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()
}

Ovde, SELECT FOR UPDATE zaključava red korisnika, tako da druge transakcije ne mogu da ga izmene dok se trenutna transakcija ne završi. Ovo sprečava probleme sa konkurentnim pristupom, kao što su duple oduzimanja sredstava.