Sud*_*dip 5 oracle nhibernate transactionscope
以下代码片段适用于SQL Server 2008(SP1),但对于Oracle 11g,对session.BeginTransaction()的调用会抛出异常,并显示消息"Connection已经是本地或分布式事务的一部分"(下面显示的堆栈跟踪) .使用'"NHibernate.Driver.OracleDataClientDriver".
有没有其他人遇到这个?
using (var scope = new TransactionScope())
{
using (var session = sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction())
{
// do what you need to do with the session
transaction.Commit();
}
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
Exception at: at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)
at NHibernate.Transaction.AdoTransaction.Begin()
at NHibernate.AdoNet.ConnectionManager.BeginTransaction()
at NHibernate.Impl.SessionImpl.BeginTransaction()
at MetraTech.BusinessEntity.DataAccess.Persistence.StandardRepository.SaveInstances(List`1& dataObjects) in S:\MetraTech\BusinessEntity\DataAccess\Persistence\StandardRepository.cs:line 3103
Inner error message was: Connection is already part of a local or a distributed transaction
Inner exception at: at Oracle.DataAccess.Client.OracleConnection.BeginTransaction(IsolationLevel isolationLevel)
at Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction(IsolationLevel isolationLevel)
at System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction()
at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)
此处概述了仅使用事务范围的问题: NHibernate FlushMode在查找之前自动不刷新
它看起来像nhibernate(v3.1与oracle方言和11g db w/opd.net v2.112.1.2)需要它自己的事务来避免刷新问题,但我无法让事务范围与nhibernate一起工作交易.
我似乎无法让它工作:(这可能是nhibernate或odp.net的缺陷,不确定...
在这里发现了同样的问题: NHibernate 3.0:TransactionScope和Auto-Flushing
固定:找到了解决方案!通过输入"enlist = dynamic;" 进入我的oracle连接字符串,问题得到了解决.我已经能够使用nhibernate事务(修复flush问题)和事务范围,如下所示:
ISessionFactory sessionFactory = CreateSessionFactory();
using (TransactionScope ts = new TransactionScope())
{
using (ISession session = sessionFactory.OpenSession())
using (ITransaction tx = session.BeginTransaction())
{
//do stuff here
tx.Commit();
}
ts.Complete();
}
Run Code Online (Sandbox Code Playgroud)
我检查了我的日志文件并发现了这个:2011-06-27 14:03:59,852 [10] DEBUG NHibernate.Impl.AbstractSessionImpl - 登入DTC事务:Serializable
在连接上执行任何SQL之前.我将进行单元测试以确认正确执行.我不太确定序列化可以告诉我什么
有一个问题,你为什么要做内部 session.BeginTransaction - 因为 2.1 GA NHibernate 会自动注册到 TransactionScope 上下文中,所以没有理由再做你自己的事情了。