2016-05-26 1 views
1

J'ai certains SP dans une base de données "Microsoft SQL Server 2012 (SP3)". Ces SP peuvent être appelés à partir d'applications VB6 et d'autres SP, ou à partir d'applications .Net.TSQL - Transaction distribuée ou locale?

Si un SP est appelé à partir d'autres SP ou applications VB6, je peux annuler la transaction en cours et donner des messages d'erreur corrects avec raiserror en cas d'erreurs/entrées invalides.

Mais parce que les connexions ouvertes par les applications .Net sont accrochés à transactions distribuéessi plusieurs services WCF sont impliqués (il est une norme de l'entreprise, nous utilisons MS DTC) Je ne devrais pas annuler la transaction et je ne appelez raiserror commande.

Si nous roulera la transactions distribuées, tous les messages d'erreur élevés avec la commande raiserror sont perdus et sur le côté .Net, nous obtenons une exception dont le message est:

Le Coordinateur de transactions distribuées Microsoft (MS DTC) a annulé la transaction distribuée

Comment puis-je savoir si je suis dans une transaction distribuée ou si je suis dans une transaction locale pendant le codage au sein SPs? Si je suis dans une transaction distribuée, je n'exécuterai pas l'instruction de restauration.

Toute aide serait appréciée.

+0

Peut-être que ce fil peut vous aider, j'espère que ce n'est pas trop vieux http://stackoverflow.com/questions/2919018/in-sql-server-how-do-i-know-what -transaction-mode-im-actuellement-using – Petaflop

+0

Aussi, je ne sais pas combien de ces SP vous avez, mais vous pouvez avoir un paramètre dans chacun d'eux pour indiquer si vous devez annuler ou non – Petaflop

+0

@MSANZ merci, J'ai déjà visité ce sujet, mais cela n'a pas aidé les transactions distribuées. Il ne peut dire que des modes de transaction explicites non-implicites. À propos de l'ajout d'un paramètre à chaque SP, il est pratiquement impossible à cause du grand nombre de SP et parce que les SP font des appels subséquents à d'autres SP. Je ne peux pas connaître le chemin sur lequel une transaction rejetant SP est appelée, donc je dois ajouter le paramètre à tous les SP et propager la valeur à tous les appels suivants. –

Répondre

0

Pour ceux qui ont fait face au même problème, j'ai trouvé une solution temporaire:

Je vérifie la vue sys.dm_tran_session_transactions.

La colonne is_enlisted devient vraie si je viens de .Net et si j'ai démarré une transaction msdtc du côté .Net. Edit: la vue sys.dm_pdw_nodes_tran_session_transactions est utilisée dans les bases de données azure sql (ceci peut être valide dans les installations en cluster, je pense), et sys.dm_tran_session_transactions est utilisé dans d'autres éditions. Donc, j'ai édité la réponse à utiliser sys.dm_tran_session_transactions