我目前正在开发一个企业解决方案,它承载了几个应用程序,因此我实现了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))
{
}
}
这会没有问题吗?由于我正在使用多个服务器,因此事务范围如何知道要在哪个服务器上进行事务处理?是否有更好的方法来处理嵌套事务处理事务管理?
你还明白我的问题吗? ;)
答案 0 :(得分:0)
TransactionScope将根据实际使用的Ado.Net连接自动确定。这应该让您在数据库服务器之间进行两阶段提交(通过MSDTC),如果它们支持它并且您enabled/configured your environment支持应用程序服务器和数据库服务器之间的全局事务。
我更喜欢以声明的方式使用Spring.Net to manage transactions。但我不得不承认我没有将它用于多个NHibernate会话工厂。