Les transactions imbriquées - scénario de Restauration
A(){
con.begin;
.........
.........
B();
........
........(con.rollback;)
con.commit;
}
B{
con.begin;
.......
.......
con.commit;
}
Dans le code ci-dessus, je commence une nouvelle DB transaction à Un(). Il exécute certains transaction avec succès. Après que B() commence l'exécution et il est également responsable de certaines transactions avec succès et maintenant, le contrôle revient à l'(). À ce stade, certains exception se produit et je fais un retour en arrière. Je voudrais savoir si la transaction qui a réussi à B() restaure ou pas.
Connexes: stackoverflow.com/questions/204557/... et postgresql.org/docs/8.3/interactive/tutorial-transactions.html (de la recherche pour "point de sauvegarde")
OriginalL'auteur Selva | 2010-09-24
Vous devez vous connecter pour publier un commentaire.
La réponse courte est non. La réponse longue est comme suit.
De soutien pour les transactions imbriquées dans Java dépend de plusieurs variables.
De soutien pour les transactions Imbriquées dans JTA
D'abord et avant tout, si vous utilisez JTA, c'est jusqu'à la Transaction Manager pour prendre en charge les transactions imbriquées. Toute tentative d'entamer une transaction peut entraîner une NotSupportedException être levée par un Gestionnaire de Transactions (qui ne prend pas en charge les transactions imbriquées) si il y a une tentative de démarrer une nouvelle transaction dans un thread qui est déjà associée à une transaction.
De la Java Transaction API 1.1 spécifications:
De soutien pour les transactions Imbriquées dans JDBC
JDBC 3.0 introduit le Point de sauvegarde classe, qui est plus ou moins similaire à la notion de points de sauvegarde dans la base de données. Les points d'enregistrement doivent être initialisées à l'aide de la Connexion.setSavepoint() méthode qui renvoie une instance d'un point de sauvegarde. On peut revenir à ce point de sauvegarde à un moment plus tard dans le temps à l'aide de la Connexion.rollback(point de sauvegarde svpt) méthode. Tout cela, bien sûr, dépend de si vous utilisez un JDBC 3.0 driver compatible qui prend en charge l'établissement de points de sauvegarde et de restauration.
Impact de l'Auto-Commit
Par défaut, toutes les connexions obtenus sont mis à validation automatique, à moins qu'il y est un écart clair sur ce front par le pilote JDBC. Lorsque cette fonctionnalité est activée automatiquement les règles de la portée d'avoir des transactions imbriquées, de toutes les modifications effectuées dans la base de données via la connexion sont automatiquement enregistrées à l'exécution.
Si vous désactivez l'auto-commit fonctionnalité, et choisir de s'engager explicitement et de restauration des opérations, puis de valider une transaction toujours valide toutes les modifications effectuées par une connexion de jusqu'à ce point dans le temps. Notez que les modifications choisi pour la validation ne peut pas être défini par un programmeur - toutes les modifications jusqu'à cet instant, sont choisis pour s'engager, s'ils ont été effectués dans une méthode ou d'une autre. Le seul moyen de sortir est de définir les points d'enregistrement, ou de pirater votre chemin passé le pilote JDBC - le pilote habituellement valide toutes les modifications effectuées par une connexion associée à un fil, afin de commencer un nouveau thread (c'est mauvais) et l'obtention d'une nouvelle connexion, vous donne souvent un nouveau contexte de transaction.
Vous pourriez également vouloir vérifier comment votre cadre de soutien de l'offre pour les transactions imbriquées, surtout si vous êtes isolé à partir de l'API JDBC ou de démarrer de nouvelles transactions JTA sur votre propre.
Basée sur la description ci-dessus de façon imbriquée soutien à la transaction est éventuellement obtenus dans les différents scénarios, il semble qu'un retour en arrière dans votre code annulera tous les changements liés à l'objet de Connexion.
OriginalL'auteur Vineet Reynolds
Qui ressemble à une mauvaise gestion des transactions, j'ai peur. Il serait bon que vous vous gérer les validations et les restaurations de la appelants à A et B à la place.
OriginalL'auteur Mastermnd
Que par votre code, dans Un() vous commencez l'opération. Passez ensuite à B() lorsque vous lancez la transaction de nouveau, ce qui permettra d'engager la totalité de la transaction précédente. Puis à la fin de B(), la transaction est explicitement engagé. À ce stade, votre code est engagé. Maintenant le code de retour d'Un() et le reste du code est traité. En cas d'exception, seule cette partie après B() va être restaurée.
OriginalL'auteur Ashish Patil
Vous pouvez utiliser Java.SQL intégré dans le point d'enregistrement de la fonction dans Postgresql 8.
Lorsqu'un SQL-exception se produit, la transaction en cours est roulé vers le point de sauvegarde, et les autres transactions peuvent se produire. Sans le roll-back, à la suite des opérations va échouer.
OriginalL'auteur