2009-08-13 8 views
9

Je suis baladé sur toute chose transaction imbriquée dans le serveur SQL, et je l'ai luisaient ces pépites de compréhension du comportement des imbriqué trans':SQL Server 2005: Pourquoi les transactions de noms?

  • Lorsque les opérations de nidification, seule la extérieure Livrer fait valider.
  • "Commit Trans txn_name", lorsqu'il est imbriqué , s'appliquera toujours à la transaction la plus interne , même si txn_name fait référence à à une transaction externe.
  • "ROLLBACK TRAN" (aucun nom), même dans une transaction interne, annulera toutes les transactions.
  • "ROLLBACK TRAN txn_name" - txn_name doit faire référence au nom txn le plus externe. Sinon, il va échouer.

Étant donné ceux-ci, y a-t-il un avantage à faire des transactions de dénomination? Vous ne pouvez pas l'utiliser pour cibler une tranasction spécifique, que ce soit pour la validation ou la restauration. Est-ce seulement à des fins de commentaire de code?

Merci,

Yoni

+0

Une raison de plus, ne vaut pas une réponse IMO, est [ici] (http://www.sqlskills.com/blogs/paul/code-to-show-backed-back-transactions-after-a-crash/). –

Répondre

2

Vous pouvez avoir des procédures que rollback leur propre travail en cas d'erreur, ce qui permet à l'appelant de décider wether d'abandonner la transaction entière ou récupérer et essayer un autre chemin. Voir Exception handling and nested transactions pour un modèle de procédure qui permet ce comportement atomique.

+1

Vraiment? Mais le doc dit que vous ne pouvez pas annuler une transaction interne imbriquée, vous pouvez seulement annuler la transaction la plus externe. Je ne vous dispute pas parce que je ne l'ai pas essayé, je suis simplement curieux de savoir comment cela fonctionne réellement. –

+1

Vous pouvez revenir à un point de sauvegarde. Je pense que ce n'est pas la même chose qu'une transaction nommée, mais je pense que c'est ce que vous recherchez vraiment. –

+1

Remus - Bon point sur le point de sauvegarde. Sinon, (Si vous n'utilisez pas les points de sauvegarde, ce que je ne suis pas actuellement), aucun avantage? – user144133

0

L'idée est d'annuler une partie de votre travail, comme une transaction imbriquée. Ne fonctionne pas toujours comme prévu. procédures stockées à l'aide de la gestion des erreurs de style ancien et savepoints peuvent ne pas fonctionner comme prévu lorsqu'ils sont utilisés conjointement avec TRY ... blocs CAPTURE: Avoid mixing old and new styles of error handling.

déjà discuté ici @@ERROR and/or TRY - CATCH

+0

Mais cela ne réduit pas une partie de votre travail. Les transactions d'imbrication sont simplement incrémentées @@ TRANCOUNT. Rétablir une transaction imbriquée annule le tout. Sauf si vous parlez de points de sauvegarde. –

6

efficacement c'est juste une aide de programmeurs mémoire. Si vous traitez avec un Tx qui a un certain nombre de transactions internes, donner chaque nom significatif peut vous aider à vous assurer que les tranactions sont imbriquées de manière appropriée et peuvent attraper des erreurs logiques.

+2

+1 pour 'aide memoire' –