Sobes.tech
Junior — Middle

Avez-vous déjà utilisé la commande SELECT FOR UPDATE dans vos projets pour verrouiller des lignes lors des transactions?

sobes.tech IA

Réponse de l'IA

Oui, la commande SELECT FOR UPDATE est souvent utilisée pour verrouiller les lignes sélectionnées dans la base de données pendant une transaction, afin d'éviter les conditions de course et d'assurer l'intégrité des données.

En Go, lors de l'utilisation de database/sql ou ORM, vous pouvez exécuter une telle requête pour verrouiller les lignes pour une mise à jour ultérieure :

// Exemple d'utilisation de SELECT FOR UPDATE en 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()
}

Ici, SELECT FOR UPDATE verrouille la ligne de l'utilisateur pour que d'autres transactions ne puissent pas la modifier jusqu'à ce que la transaction en cours soit terminée. Cela empêche les problèmes d'accès concurrent, comme la double déduction de fonds.