Sobes.tech
Junior — Middle

Vai jūs kādreiz esat izmantojis SELECT FOR UPDATE komandu savos projektos, lai bloķētu rindas transakciju laikā?

sobes.tech AI

Atbilde no AI

Jā, SELECT FOR UPDATE bieži tiek izmanto, lai bloķētu atlasītās rindas datu bāzē transakcijas laikā, lai novērstu sacensību apstākļus un nodrošinātu datu integritāti.

Go valodā, strādājot ar datu bāzēm caur database/sql vai ORM, var izpildīt šādu vaicājumu, lai bloķētu rindas turpmākai atjaunināšanai:

// Piemērs, kā izmantot `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()
}

Šeit SELECT FOR UPDATE bloķē lietotāja rindu, lai citas transakcijas to nevarētu mainīt līdz brīdim, kad pašreizējā transakcija tiks pabeigta. Tas novērš konkurences problēmas, piemēram, dubultu līdzekļu izņemšanu.