【问题标题】:hhibernate transaction issue when i used in mono我在单声道中使用时出现休眠事务问题
【发布时间】:2012-10-11 19:17:15
【问题描述】:

我正在使用 Visual Estudio 2010 c#、nhibernate queryover、silverlight 5 开发我的应用程序,在这部分中,我使用的数据访问部分都可以正常工作:

using (var session = NHibernateFactory.OpenSession())
{
   ClassAlias ca = null;
   var x = session.QueryOver<SomeClass>()
           .Where(root=>root.SomeField > somefield)
           .SelectList(list=>list
            .Select(root=>root.SomeField1).WithAlias(()=>ca.SF1)
             ...
            .Select(root=>root.SomeFieldN).WithAlias(()=>ca.SF2)
            )
            .UnderlyingCriteria.SetResultTransformer(
                        Transformers.AdvanceEntityMapTransformer<ClassAlias>())
                    .List<ClassAlias>();

}

所有的数据访问都是select语句,所以问题是当我用mono将我的应用程序发布到linux环境时,我开始得到这个间歇性错误:

16:51:45.488 [Threadpool worker] ERROR NHibernate.Transaction.AdoTransaction - Begin transaction failed
System.NotImplementedException: The requested feature is not implemented.
  at MySql.Data.MySqlClient.MySqlConnection.EnlistTransaction (System.Transactions.Transaction transaction) [0x00000] in <filename unknown>:0
  at MySql.Data.MySqlClient.MySqlConnection.Open () [0x00000] in <filename unknown>:0
  at NHibernate.Connection.DriverConnectionProvider.GetConnection () [0x00000] in <filename unknown>:0

此日志来自 nhibernate 通用日志文件,认为我找不到修复它的人,任何帮助都会非常受欢迎

我添加了一个自定义日志来捕获异常,并确保 nhibernate 中的这个异常是我的查询失败的原因,就是这种情况,这就是异常:

 ERROR serverAppLog - custom error message
NHibernate.Exceptions.GenericADOException: could not execute query
[ SELECT this_.list_id as y0_, this_.list_name as y1_ FROM vicidial_lists this_ ]
[SQL: SELECT this_.list_id as y0_, this_.list_name as y1_ FROM vicidial_lists this_] ---> System.NotImplementedException: The requested feature is not implemented.
  at MySql.Data.MySqlClient.MySqlConnection.EnlistTransaction (System.Transactions.Transaction transaction) [0x00000] in <filename unknown>:0
  at MySql.Data.MySqlClient.MySqlConnection.Open () [0x00000] in <filename unknown>:0
  at NHibernate.Connection.DriverConnectionProvider.GetConnection () [0x00000] in <filename unknown>:0
  --- End of inner exception stack trace ---
  at NHibernate.Loader.Loader.DoList (ISessionImplementor session, NHibernate.Engine.QueryParameters queryParameters) [0x00000] in <filename unknown>:0
  at NHibernate.Loader.Loader.ListIgnoreQueryCache (ISessionImplementor session, NHibernate.Engine.QueryParameters queryParameters) [0x00000] in <filename unknown>:$
  at NHibernate.Loader.Loader.List (ISessionImplementor session, NHibernate.Engine.QueryParameters queryParameters, ISet`1 querySpaces, NHibernate.Type.IType[] resu$
  at NHibernate.Loader.Criteria.CriteriaLoader.List (ISessionImplementor session) [0x00000] in <filename unknown>:0
  at NHibernate.Impl.SessionImpl.List (NHibernate.Impl.CriteriaImpl criteria, IList results) [0x00000] in <filename unknown>:0

【问题讨论】:

  • 您是否在应用程序中使用 System.Transactions / TransactionScope?
  • 我没有直接使用,但是我使用的 NHibernate 的发行版由我的公司提供。

标签: visual-studio-2010 nhibernate mono


【解决方案1】:

如果您正在使用 System.Transactions / TransactionScope(从您的堆栈跟踪中看起来是这样),那么我怀疑这是因为事务正在升级为分布式事务(即 DTC)。

如果您尝试访问同一 TransactionScope 内的两个不同事务资源,通常会发生这种情况 - 例如。两个不同的数据库(或同一个数据库但连接字符串不同),或 MSMQ 和一个数据库。

问题是大多数 MySql 驱动程序不支持 DTC - 这就是引发此异常的原因。您有多种选择:

  1. 找出它升级的原因并找到避免这种情况的方法(如果可能,最好的性能 - DTC 相对较慢)
  2. 修复 MySql 驱动程序以升级或不加入(我不确定后者的后果)
  3. 我听说有一些商业 MySql 驱动程序确实支持 DTC - 请与 Google 核实
  4. 可能使用ODBC,见Distributed transactions between MySQL and MSSQL(这个我没试过,不过好像可以)
  5. 使用 Sql Server :)

【讨论】:

  • 非常感谢您的回复,我觉得它真的很有用。我将尝试找出导致 DTC 上下文的原因并尝试避免它。我希望在任何情况下都能让你知道
  • 我找不到任何会导致这种情况的东西,至少没有编译,可能导致我的应用程序包含(一个使用 NHibernate 从数据库(mysql)获取数据并将它们提供给通过 wcf 应用 silverligth) 被称为 PHP 页面中的控件?
  • 检查 WCF 服务上的 TransactionFlowAttribute 和 OperationBehavior(TransactionScopeRequired = true)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 2017-05-09
  • 2023-04-07
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多