当前位置: 首页 > 编程语言 > C#

nhibernate中缺乏对环境事务的支持?分享

时间:2023-04-10 20:59:33 C#

nhibernate环境事务支持不足?我知道NHibernate支持环境事务,因为NHibernate会话在事务范围内征用环境事务。但是,有一些奇怪之处,请考虑以下测试:);ISessionsession=sessionFactory.OpenSession();SessionFactoryOneTimeInitializer.CreateDataBaseSchemaIfRequiredByConfiguration(session);using(newTransactionScope()){using(ITransactiontransaction=session.BeginTransaction()){//acttransaction.Rollback();}//断言Assert.AreEqual(TransactionStatus.Aborted,Transaction.Current.TransactionInformation.Status);}}这个测试失败了。NHibernate如何确保环境事务不会持久保存到数据库中?我比较熟悉Hibernate如何在Java世界中使用JTA,但我不是.NET专家。但是你的问题引起了我的注意。在Java中,您需要使用JDBC或JTA事务配置Hibernate。在这种情况下,Hibernate返回的Transaction对象包装绑定到数据库连接(JDBC)的事务或线程本地全局事务。可以使用UserTransaction#setRollbackOnly使全局线程本地事务上下文无效,这确保它永远不会成功提交。但是,最好不要通过Hibernate来管理事务,而只是使用JTA提供的UserTransaction对象。这在NHibernate中似乎也是一样的,有两个事务工厂。一种用于分布式事务,一种用于本地事务。但两者都返回AdoTransaction:publicITransactionCreateTransaction(ISessionImplementorsession){returnnewAdoTransaction(session);这在分布式/环境事务的情况下似乎不一致。我看不出回滚在这种情况下是如何工作的,因为全局事务上下文不能在.NET中无效(据我所知),并且AdoTransaction似乎代表数据库连接上的事务。所以我认为你的问题的答案是“它不会”,这可以解释你的测试失败。这意味着如果您使用环境事务,则不应通过NHiberate管理事务。就像不推荐Hibernate和JTA的做法一样。编辑另见这个问题:TransactionScope如何回滚事务?以上是C#学习教程:Nhibernate中缺少对环境事务的支持?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: