2010-08-02 3 views
0

J'ai deux objets IDbCommand créés à partir d'une session NHibernate, et ils sont enrôlés dans une transaction via la session NHibernate. La première commande de base de données insère une valeur dans une table temporaire globale Oracle et la deuxième commande lit les valeurs de la table. Avec un Oracle GTT, une transaction est nécessaire pour les deux commandes afin de préserver les données dans le GTT. La chose étrange est que la deuxième commande lit les valeurs de la GTT, comme prévu, quand elle est exécutée sur un serveur, mais le même code exact ne fonctionne pas sur l'autre serveur. Ce qui est encore plus étrange, c'est que la première requête sur le serveur non fonctionnel fonctionne si elle se produit immédiatement après le recyclage des processus de travail IIS. Chaque demande après cela ne fonctionne pas - en particulier, les valeurs dans le GTT ne sont pas conservées après avoir été inséré.IDbCommand n'est pas correctement enrôlé dans la transaction NHibernate

ISession session = sessionFactory.GetSession(); 
ITransaction transaction = session.BeginTransaction(); 

IDbCommand cmdInsert = session.Connection.CreateCommand(); 
transaction.Enlist(cmdInsert); 
cmdInsert.CommandText = "insert into TEMP_TABLE values (1)"; 
cmdInsert.ExecuteNonQuery(); 

IDbCommand cmdRead = session.Connection.CreateCommand(); 
transaction.Enlist(cmdRead); 
cmdRead.CommandText = "select from TEMP_TABLE"; 

// Nothing is returned here after the second request 
cmdRead.ExecuteQuery(); 

transaction.Commit(); 

Pourquoi la transaction est créée à partir d'une session NHibernate pas s'engager correctement IDbCommands après la première demande à un serveur IIS?

+0

Quel est le code pour cette "sessionFactory"? (GetSession n'est pas une méthode de ISessionFactory, donc je suppose que c'est quelque chose de différent) –

+0

J'ai effectivement réduit cela à du code ADO.NET. J'ai posté une autre publication sur http://stackoverflow.com/questions/3397227/ado-net-transaction-does-not-enlist-commands-after-first-connection-is-opened-and –

Répondre

0

Nous avons fini par utiliser le pilote Oracle Data Provider pour .NET (ODP.NET) et remplacer le pilote obsolète Microsoft System.Data.OracleClient. Cela a corrigé le support de transaction. Je ne sais pas pourquoi le pilote obsolète a fonctionné sur un serveur et pas sur l'autre, mais je suppose que c'est déprécié, donc je ne vais pas enquêter plus loin.

Questions connexes