Cela se produit car SQL Server ne prend pas vraiment en charge les transactions imbriquées.
Si vous commit ou rollback imbriqués stockées proc (pas d'opération), alors vous allez générer l'erreur 266 en raison d'un @@TRANCOUNT différente sur le départ et l'entrée
La restauration problème peut être résolu par l'utilisation de SET XACT_ABORT SUR ce qui est "auto rollback" (tout simplement) et supprime l'erreur 266.
La validation question... vous ne pouvez pas en tant que tel. Toutefois, vous pouvez contrôler où il arrive en notant @@TRANCOUNT sur stockées proc d'entrée et de commettre seulement si zéro.
Vous ne pouvez pas vous engager dans une procédure imbriquée, mais à partir d'une transaction permettra d'envelopper toutes les procédures imbriquées à l'intérieur. De sorte que la transaction est bon pour toutes les procédures stockées imbriquée à l'intérieur de la transaction. Dans les transactions distribuées, l'intégrité des données même de la traverse de la machine de limites.
Vous devez jumeler votre BEGIN TRAN et s'Engage dans la même procédure stockée
Si vous appelez d'une autre procédure stockée qui dispose également d'une transaction, à la suite BEGIN TRAN /COMMIT TRAN paires d'incrémentation et de décrémentation @@Trancount respectivement.
La transaction est validée sur le "dernier" COMMIT TRAN (@@Trancount = 1)
Cependant, toute annulation sera toujours revenir à la transaction.
Oui, c'est possible. Avec des langages de programmation comme le C#, lorsque vous passer de la connexion et de l'objet de la transaction avec la commande. si quelque chose est détecté comme faux que d'annuler la transaction:
string customerConnection ="Connection";
string query ="insert into temp values ('Data2','data1','data2','data3')";
string query2 ="update tempcst set data = 'Hello data'";
SqlConnection myConnection = new SqlConnection(customerConnection);
myConnection.Open();
SqlTransaction myTrans = myConnection.BeginTransaction();
Try{
int result = executeNonQuery(query, myConnection, myTrans,"");
i = executeNonQuery(query2, myConnection, myTrans,"");
myTrans.Commit();}
catch{
myTrans.Rollback();
myConnection.Close();}
Commit et rollback ont des effets différents
Cela se produit car SQL Server ne prend pas vraiment en charge les transactions imbriquées.
Si vous commit ou rollback imbriqués stockées proc (pas d'opération), alors vous allez générer l'erreur 266 en raison d'un @@TRANCOUNT différente sur le départ et l'entrée
La restauration problème peut être résolu par l'utilisation de SET XACT_ABORT SUR ce qui est "auto rollback" (tout simplement) et supprime l'erreur 266.
La validation question... vous ne pouvez pas en tant que tel. Toutefois, vous pouvez contrôler où il arrive en notant @@TRANCOUNT sur stockées proc d'entrée et de commettre seulement si zéro.
Pour corriger le traitement des transactions, voir mes réponses ici s'il vous plaît:
Les procédures stockées imbriquées contenant des TRY CATCH RESTAURATION de modèle? et Ai-je compter les transactions avant de restauration dans un bloc catch en T-SQL?
OriginalL'auteur gbn
Vous ne pouvez pas vous engager dans une procédure imbriquée, mais à partir d'une transaction permettra d'envelopper toutes les procédures imbriquées à l'intérieur. De sorte que la transaction est bon pour toutes les procédures stockées imbriquée à l'intérieur de la transaction. Dans les transactions distribuées, l'intégrité des données même de la traverse de la machine de limites.
http://msdn.microsoft.com/en-us/library/ms188929(v=SQL.90).aspx
OriginalL'auteur Robert Harvey
Vous devez jumeler votre BEGIN TRAN et s'Engage dans la même procédure stockée
Si vous appelez d'une autre procédure stockée qui dispose également d'une transaction, à la suite BEGIN TRAN /COMMIT TRAN paires d'incrémentation et de décrémentation @@Trancount respectivement.
La transaction est validée sur le "dernier" COMMIT TRAN (@@Trancount = 1)
Cependant, toute annulation sera toujours revenir à la transaction.
MSDN a une bonne explication.
OriginalL'auteur StuartLC
Oui, c'est possible. Avec des langages de programmation comme le C#, lorsque vous passer de la connexion et de l'objet de la transaction avec la commande. si quelque chose est détecté comme faux que d'annuler la transaction:
OriginalL'auteur C S Tiwari