Sobes.tech
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.