Ado.net事务范围,NHibernate和多个服务器

时间:2009-12-10 12:31:48

标签: nhibernate transactions

我目前正在开发一个企业解决方案,它承载了几个应用程序,因此我实现了NHibernate来处理多个会话工厂。我创建了一个自定义部分,如:

  <hibernate-sessionFactories>
    <sessionFactories>
      <clear/>
      <add name="Server1" factoryConfigPath="~/SessionFactoryConfigurations/Server1.config"/>
      <add name="Server2" factoryConfigPath="~/SessionFactories/Server2.config" />
    </sessionFactories>
  </hibernate-sessionFactories>

我实现了一个懒惰的单例会话提供程序,它根据需要实例化这些会话工厂。

我正在使用存储库模式。在持久化方法中,为了获得当前的NHibernate会话,我现在可以调用类似

的东西
ISession session = sessionProvider.GetCurrentSessionFrom(sessionFactoryConfigName);

因此,根据会话工厂配置名称,我得到了正确的会话。对于事务性事物,我想使用System.Transactions.TransactionScope,因此我可以进行“嵌套”事务,如:

using(var scope = new TransactionScope(System.Transactions.TransactionScopeOption.Required))
{
  using(var scope = new TransactionScope(System.Transactions.TransactionScopeOption.Required))
  {
  }
}

这会没有问题吗?由于我正在使用多个服务器,因此事务范围如何知道要在哪个服务器上进行事务处理?是否有更好的方法来处理嵌套事务处理事务管理?

你还明白我的问题吗? ;)

1 个答案:

答案 0 :(得分:0)

TransactionScope将根据实际使用的Ado.Net连接自动确定。这应该让您在数据库服务器之间进行两阶段提交(通过MSDTC),如果它们支持它并且您enabled/configured your environment支持应用程序服务器和数据库服务器之间的全局事务。

我更喜欢以声明的方式使用Spring.Net to manage transactions。但我不得不承认我没有将它用于多个NHibernate会话工厂。