Junior — Middle
Est-il possible de mettre en œuvre des transactions imbriquées dans le système, et dans quels cas cela est-il acceptable?
sobes.tech IA
Réponse de l'IA
Dans la bibliothèque standard de Go (package database/sql), les transactions imbriquées ne sont pas directement prises en charge, car la plupart des SGBD ne mettent pas en œuvre de véritables transactions imbriquées. À la place, on utilise souvent des points de sauvegarde (savepoints), qui permettent de revenir à un état spécifique à l’intérieur d’une transaction.
Options possibles :
- Utiliser des savepoints si le SGBD les supporte (par exemple, PostgreSQL, MySQL). En Go, cela peut se faire en exécutant des commandes SQL
SAVEPOINT,ROLLBACK TO SAVEPOINT. - Imiter des transactions imbriquées via des transactions séparées, mais ce n’est pas toujours cohérent du point de vue de la logique métier.
Quand cela est autorisé :
- Lorsqu’il est nécessaire de revenir partiellement sur des modifications dans une grande transaction sans l’annuler complètement.
- Lors d’opérations complexes avec plusieurs étapes, où chaque étape peut être annulée séparément.
Exemple d’utilisation des savepoints en Go :
tx, err := db.Begin()
if err != nil {
// gestion de l’erreur
}
_, err = tx.Exec("SAVEPOINT sp1")
if err != nil {
tx.Rollback()
return err
}
// Exécution des opérations
// En cas d’erreur :
_, err = tx.Exec("ROLLBACK TO SAVEPOINT sp1")
// Continuer ou faire un commit complet
err = tx.Commit()
Ainsi, les transactions imbriquées sont réalisées via des savepoints, et non via des appels imbriqués à Begin/Commit.