2011-11-02 2 views
4

J'ai un serveur Web et deux serveurs DB sur deux réseaux différents, Db1 et Db2 (Remote Database)."La transaction a déjà été implicitement ou explicitement validée ou annulée" dans la portée

  • DB1: SQL Server 2008 R2, système d'exploitation: Windows Server 2003 SP2
  • DB2: SQL Server 2000, système d'exploitation: Windows Server 2003 R2
  • Web serveur: Windows Server 2003 R2

Je souhaite insérer deux enregistrements différents dans ces bases de données et j'utilise un TransactionScope.

using (TransactionScope tscope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
{ 
    //open connection db 1 
    //insert into db1 

    //open connection db2 -- the problem is here 
    //insert into db2 

    tscope.Complete(); 
} 

Quand je trace le code source, l'insertion dans la première databse est fait avec succès, mais lorsque la seconde connexion veut être ouverte que je rencontre ci-dessous erreur.

Erreur:

The transaction has already been implicitly or explicitly committed or aborted.

J'ai configuré MSDTC, coordinateur de transactions Distributrd et tout est ok. Je peux avoir une transaction distribuée dans le serveur My DB et je n'ai aucun problème. Quel est le problème avec TransactionScope? Aidez-moi, s'il vous plaît.

la première connexion est LINQ to SQL:

DataClassesDataContext Dac = new DataClassesDataContext(); 
Dac.Connection.ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionCs"].ConnectionString; 
tbl_KargahDistribution Workshop = new tbl_KargahDistribution(); 
Workshop.WpCode = Bodu.WpRealCode; 
Workshop.State = Bodu.BduState; 
Workshop.City = Bodu.BduCity; 
Workshop.Town = Bodu.BduTown; 
Workshop.SubSystem = Bodu.BduSubSystem; 
Dac.tbl_KargahDistributions.InsertOnSubmit(Workshop); 
Dac.SubmitChanges(); 

la deuxième connexion est:

Queries Qu = new Queries(); 
SqlCon = new SqlConnection(BoBaz.BazConnectionString); 
SqlCon.Open(); 
string sq = Qu.InsertWorkshopBaseInfo(); 
SqlCom = new SqlCommand(sq, SqlCon); 
+2

Pouvez-vous inclure les détails sur l'ouverture de votre connexion? – Kane

+0

Avez-vous essayé de jouer autour de 'SqlConnection.BeginTransaction()', 'Transaction.Current.EnlistVolatile()', etc.? – abatishchev

+0

Je viens d'utiliser enlist = false; dans la deuxième chaîne de connexion, je n'ai reçu aucun message d'erreur et le problème a été résolu. Mais je pense quand je mets enlist = false; ma deuxième connexion ne fera pas partie de la transaction, donc je ne l'ai pas utilisée. –

Répondre

0

I have configured MSDTC, Distributrd transaction coordinator and every thing is ok. I can have distributed transaction in My DB server and I have no problem.

Cela peut être vrai, mais avec un DTC multi-machine, il est préférable de revérifier. Cette erreur a souvent ses racines dans les problèmes de réseau. La base de données peut ne pas être en mesure de communiquer avec le serveur Web (problèmes de modification DNS ou IP) ou le pare-feu du client peut bloquer DTC (vérifiez les paramètres du pare-feu Windows sur le serveur Web).

0

Ne le remarquez-vous que lorsque vous parcourez le code?

Il est possible que la transaction expire et se rétracte automatiquement car le délai nécessaire pour parcourir le code dépasse le délai d'expiration de TransactionScope. Je pense que la valeur du délai d'expiration par défaut est de 60 secondes.

Questions connexes