TransactionScope - Le fournisseur sous-jacent échoué sur EnlistTransaction. MSDTC été interrompue
Notre équipe ont eu un problème qui se manifeste par:
Le fournisseur sous-jacent échoué sur EnlistTransaction; Impossible d'accéder à un
objet supprimé.Nom de l'objet: "Transaction".
qui avait semblé dès que nous avons commencé à utiliser TransactionScope pour gérer nos applications " les transactions.
La partie supérieure de la stacktrace est capturé comme:
à
Système.Les données.EntityClient.EntityConnection.EnlistTransaction(Transaction transaction)
au Système.Les données.Objets.ObjectContext.EnsureConnection() à
System.Data.Objects.ObjectContext.ExecuteStoreCommand(String commandText, Object[] parameters)
au
Reconciliation.Models.BillLines.BillLines.Reconciliation.Interfaces.IBillLineEntities.ExecuteStoreCommand(String, Object[])
au
La réconciliation.Modèles.De l'héritage.EntityDbEnvironment.ExecuteOracleSql(String sql)
dans EntityDbEnvironment.cs: ligne 41
Dans le même temps, le journal de MSDTC est mis à jour, que j'ai extraite à l'aide de la les instructions ici:
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:30.269 ;seq=136 ;eventid=TRANSACTION_BEGUN ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"transaction has begun, description :'<NULL>'"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:30.269 ;seq=137 ;eventid=RM_ENLISTED_IN_TRANSACTION ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"resource manager #1002 enlisted as transaction enlistment #1. RM guid = 'defc4277-47a6-4cd9-b092-93a668e2097b'"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=138 ;eventid=RECEIVED_ABORT_REQUEST_FROM_BEGINNER ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"received request to abort the transaction from beginner"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=139 ;eventid=TRANSACTION_ABORTING ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"transaction is aborting"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=140 ;eventid=RM_ISSUED_ABORT ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"abort request issued to resource manager #1002 for transaction enlistment #1"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=141 ;eventid=RM_ACKNOWLEDGED_ABORT ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"received acknowledgement of abort request from the resource manager #1002 for transaction enlistment #1"
pid=7060 ;tid=7908 ;time=04/29/2013-16:38:31.658 ;seq=142 ;eventid=TRANSACTION_ABORTED ;tx_guid=60f6390c-7570-488a-97a9-2c3912c4ca3e ;"TM Identifier='(null) '" ;"transaction has been aborted"
Comme vous pouvez le voir un RECEIVED_ABORT_REQUEST_FROM_BEGINNER une seconde après RM_ENLISTED_IN_TRANSACTION a été enregistré.
Nous ne pouvons pas comprendre d'où cette demande d'annulation provient, ou pourquoi il a été soulevé. Le SQL à l'origine du problème est simple de SÉLECTIONNER lequel on peut exécuter sans problème par le biais de notre base de données client.
L'application fonctionne plus du temps, seulement de temps en temps l'affichage de cette question.
Nous sommes à l'utilisation d'Oracle 10.2.0.5.0 avec Entity Framework.
Mise à JOUR
Suivant les conseils de @Astrotrain-je configurer la journalisation du Système.Des Transactions. La dernière entrée produit est littéralement coupée à mi-chemin:
....
<ApplicationData>
<TraceData>
<DataItem>
<TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Information">
<TraceIdentifier>http://msdn.microsoft.com/2004/06/System/Transactions/TransactionScopeCreated</TraceIdentifier>
<Description>TransactionScope Created</Description>
<AppDomain>BillLineGeneratorUI.exe</AppDomain>
<ExtendedData xmlns="http://schemas.microsoft.com/2004/03/Transactions/TransactionScopeCreatedTraceRecord">
<TraceSource>[Base]
Comme vous pouvez le voir l'exception effectivement empêche le journal de finition. Que puis-je apprendre de cette expérience? Des idées?
Scratch. Voir ceci: blogs.msdn.com/b/ajit/archive/2010/05/31/...
L'abandon est plus de 1 sec après le début. Peut-être que vous avez une configuration automatique de la connexion//commande/délai d'expiration de transaction qui est définie à 1 seconde (ou 1000 ms), au lieu d'un délai raisonnable.
Ce que EF version utilisez-vous? Pourquoi ODAC version utilisez-vous? Pourquoi avez-vous besoin pour créer votre propre champ? Il n'a jamais travailler? Le
dbcontext
crée automatiquement une portée lorsque vous appelez la SaveChanges
méthode.Avez-vous vérifié la MSDN blogs de l'article à partir de mon commentaire précédent? C'est juste une question de courir Filemon et de voir si ORAMTS10.DLL est manquant . Si c'est le cas, vous pouvez utiliser la solution qui y sont décrits.
OriginalL'auteur m.edmondson | 2013-04-29
Vous devez vous connecter pour publier un commentaire.
Au lieu d'utiliser le MSDTC outil de suivi (que je trouve horriblement spartan), je peux vous recommandons d'utiliser le Système.Les opérations de la source de suivi - seulement inclure les éléments suivants dans votre site web.config:
Si vous ouvrez les fichiers journaux avec
SvcTraceViewer.exe
vous obtiendrez une belle représentation visuelle des étapes.Pas une solution en soi, mais cela peut vous donner quelques informations sur ce qui va mal.
Je ne pense pas que c'est de la WCF spécifique, le Système.Des Transactions est juste un TraceSource. Le format de sortie généré par le XmlWriterTraceListener ne semble pas être la même, mais je sais pour un fait que vous n'avez pas besoin de l'utiliser en combinaison avec une application WCF.
J'ai réussi à utiliser cette méthode pour ouvrir une session le moment, l'exception se produit, en effet, il s'arrête le journal des morts (mi-tag). J'ai mis à jour la question avec plus d'info.
En supposant que vous avez utilisé "<trace autoflush="true" />", la seule façon que je peux penser de compléter le message de log est d'utiliser l'une de l'autre tracelisteners, par exemple, voir weblogs.asp.net/ralfw/...
OriginalL'auteur Astrotrain
Comme vous l'avez mentionné "L'application fonctionne la plupart du temps, seulement de temps en temps l'affichage de cette question". par cela, nous pouvons conclure que le fournisseur ne prend en charge les transactions distribuées et la raison en est que certaines autres intermittent glitch, soit en rapport ou de la manipulation.
Êtes-vous à l'aide de transaction imbriquée étendues, parce que si, pour une raison quelconque, à l'intérieur de la portée est annulée (éliminés sans appel complet) qui serait immédiatement annuler la transaction externe l'origine de l'erreur. Utilisation TransactionScopeOption.Requis (RequiresNew également faire, mais RequiresNew a d'autres impasse des questions liées associés avec elle, il est donc préférable d'utiliser Requis) pour résoudre ce
Sinon, il pourrait être en raison de certaines autres opérations, alors la transaction est active et à résoudre dans ce cas, utilisez IsolationLevel = IsolationLevel.ReadCommitted.
OriginalL'auteur roopaliv
Nous avons eu ce problème aussi. La meilleure façon de le résoudre, semble ouvrir une nouvelle connexion de base de données et il suffit de faire les choses nécessaires à la transaction. Conserver les transactions le plus petit possible est toujours bon.
Nous avons eu le problème sans l'introduction de la 2ème connexion. Notez que l'erreur était aussi allé à l'aide de 1 connexion (db1) si l'opération a été élargie (fait doSomeDatabaseActions le cadre de la transaction).
OriginalL'auteur Gerard
Cela devrait peut-être être un commentaire mais il est trop grand. J'espère que cela aide.
L'un des plus typiques de l'erreur avec les transactions imbriquées est-ce:
Maintenant si la requête 2 qui est à l'intérieur du bloc try/catch, rasies une erreur, vous prendrez l'exception dans le bloc try/catch et de les traiter, mais ici, c'est une supprise l'application va lancer une ObjectDisposedException sur la ligne 15 lorsque vous essayez d'effectuer la transaction. C'est parce que le DTC a déjà pris de l'exception et même si vous avez manipulé, TransactionScope objets où déjà éliminés par l' .Net code et la transaction a été annulée. Notez que j'ai dit “objets” c'est parce que à la fois de l'objet TransactionScope ont été éliminés car ils sont une partie de la même transaction.
OriginalL'auteur jlvaquero