我们有一个使用NHibernate的asp.net webforms应用程序。以下是一些具体信息:
然而,我们现在遇到了许多与数据库连接相关的崩溃情况。一些研究给出了两个建议:
- 我们需要分布式事务,因为我们既要写入数据库,还要写入队列。
- 由于这是一个Web应用程序,我们使用推荐的Session-in-view模式。我们有一个HTTPModule,在BeginRequest事件上打开NHibernate会话,并在EndRequest上关闭它。
- 在请求流程中,我们有几个需要进行事务性工作的独立时刻。为此,我们使用TransactionScope。
using(var session = sessionFactory.CreateSession()){
using(var tx1 = new TransactionScope(){
//work work work
tx1.Complete();
}
//other work
using(var tx2 = new TransactionScope(){
//work work work
tx2.Complete();
}
}
然而,我们现在遇到了许多与数据库连接相关的崩溃情况。一些研究给出了两个建议:
- 在事务范围内使用NHibernate事务
- 在事务范围内创建会话
- NHibernate难道不会自动加入TransactionScope吗?为什么我们需要为NHibernate显式地创建一个事务?
- 如果我们必须在TransactionScope中创建我们的会话,那么如何将其与Session-in-view模式相结合?