2010-08-02 36 views
0

我有兩個IDbCommand對象是從一個NHibernate會話創建的,他們通過NHibernate會話進入事務。第一個數據庫命令將一個值插入到Oracle全局臨時表中,第二個命令從表中讀取值。通過Oracle GTT,兩個命令都需要一個事務來保存GTT中的數據。IDbCommand沒有正確入伍NHibernate事務

奇怪的是,當它在一臺服務器上運行時,第二個命令從GTT中讀取值,但是完全相同的代碼在另一臺服務器上不起作用。更奇怪的是,如果在IIS工作進程被回收之後立即發生,非運行服務器上的第一個請求就會工作。之後的每個請求都不起作用 - 具體而言,GTT中的值在插入後不會保留。

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(); 

爲什麼會從一個NHibernate的會話創建事務的第一個請求到IIS服務器後無法正常網羅IDbCommands?

+0

那個「sessionFactory」的代碼是什麼? (GetSession不是一個ISessionFactory的方法,所以我認爲它是不同的) – 2010-08-03 01:42:23

+0

我已經縮小到了直接的ADO.NET代碼。我在http://stackoverflow.com/questions/3397227/ado-net-transaction-does-not-enlist-commands-after-first-connection-is-opened-上發佈了另一篇文章 – 2010-08-03 14:01:37

回答

0

我們最終使用了Oracle Data Provider for .NET(ODP.NET)驅動程序並替換了棄用的Microsoft System.Data.OracleClient驅動程序。這固定了交易支持。不知道爲什麼不推薦使用的驅動程序在一臺服務器上工作,而是在另一臺服務器上工作,但我認爲它已被棄用,所以我不打算進一步調查。