Sobes.tech
Junior — Middle

Použili ste niekedy príkaz SELECT FOR UPDATE vo svojich projektoch na blokovanie riadkov počas transakcií?

sobes.tech AI

Odpoveď od AI

Áno, SELECT FOR UPDATE sa často používa na blokovanie vybraných riadkov v databáze počas transakcie, aby sa predišlo súťažným podmienkam a zabezpečila integrita údajov.

V Go, pri práci s databázami cez database/sql alebo ORM, môžete vykonať takýto dotaz na zablokovanie riadkov pre neskoršiu aktualizáciu:

// Príklad použitia `SELECT FOR UPDATE` v 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()
}

Tu SELECT FOR UPDATE zamkne riadok používateľa, takže iné transakcie ho nemôžu meniť, kým sa aktuálna transakcia nedokončí. To zabraňuje problémom s konkurenčným prístupom, ako sú duplikátne odpočty prostriedkov.