web-dev-qa-db-fra.com

Django transactions imbriquées - «avec transaction.atomic ()»

Je voudrais savoir si j'ai quelque chose comme ça:

def functionA():
    with transaction.atomic():
        #save something
        functionB()

def functionB():
    with transaction.atomic():
        #save another thing

Quelqu'un sait ce qui va se passer? Si la fonction B échoue, la fonction A sera également annulée?

Je vous remercie!

38
Lara

Oui, il sera. Indépendamment de l'imbrication, si un bloc atomique est quitté par une exception il annulera :

Si le bloc de code est terminé avec succès, les modifications sont validées dans la base de données. S'il existe une exception, les modifications sont annulées.

Notez également qu'une exception dans un bloc externe entraînera la restauration du bloc interne et qu'une exception dans un bloc interne peut être interceptée pour empêcher le bloc externe de revenir en arrière. La documentation résout ces problèmes. (Ou voir ici pour une question de suivi plus complète sur les transactions imbriquées).

38