IDbCommand没有在NHibernate事务中正确登记

时间:2010-08-02 23:33:52

标签: nhibernate

我有两个从NHibernate会话创建的IDbCommand对象,它们通过NHibernate会话登记在一个事务中。第一个数据库命令将值插入Oracle全局临时表,第二个命令从表中读取值。对于Oracle GTT,两个命令都需要一个事务,以便保留GTT中的数据。

奇怪的是,当第二个命令在一台服务器上运行时,第二个命令会按预期读取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();

为什么在第一次请求IIS服务器后,NHibernate会话创建的事务没有正确地登记IDbCommands?

1 个答案:

答案 0 :(得分:0)

我们最终使用Oracle Data Provider for .NET(ODP.NET)驱动程序并替换了已弃用的Microsoft System.Data.OracleClient驱动程序。这修复了事务支持。不确定为什么被弃用的驱动程序在一台服务器而不是另一台服务器上运行,但我想它已被弃用,所以我不打算进一步调查它。