如何在单个请求中提交和启动新事务?

时间:2009-12-18 01:39:01

标签: nhibernate

我在nhibernate中使用存储库模式。 在asp.net mvc应用程序中。 我有一个httpmodule,那个:

beginRequest it calls session.beginTransaction();
EndRequest it calls session.Transaction.Commit();

95%的情况下都可以。

我有一个案例需要在一个请求中执行以下操作:

List<User> users = factory.getUsers();

// update users

// commit transaction

// load users from the db again

我应该致电:

factory.Session.Transaction.Commit();
factory.Session.BeginTransaction();

我知道这是反对使用存储库模式的原因之一,并且在HttpModule中使用Session开始/结束,但无论如何我就是这样做的:)

我有什么选择?

Uptate 所以我现在基本上会:

页面请求如下所示:

BeginRequest:  Session.BeginTransaction();

userlist.aspx:   
               // code to fetch users from the db
               // update users
               Session.Transaction.Commit();
               Session.BeginTransaction();
               // code to fetch recently commited users form db

EndRequest:    Session.Transaction.Commit();

以上看似乎是正确的吗?

我想在调用commit之前我还应该首先检查是否有当前事务并重新开始?

1 个答案:

答案 0 :(得分:1)

你有两条逻辑

List<User> users = factory.getUsers();

// update users

load users

你想要那些在不同的交易中。所以你添加了适当的Starts和Commits。它有效,哪里有问题?

  

让会话开始/结束   HttpModule,但无论如何我就是这样   我在做什么:)我的选择是什么?

讨论的重点是HttpModule中是否有Session start结束?那么,你的选择是不要这样做!你有一个逻辑块(这里非常简单的逻辑)可能它是可重用的,所以把它移到自己的类。

你认为最好吗?

客户代码:

  useSomeLogic() // bzzzt forgot to start session

  startSession()
  useSomeLogic()  // ok thank you, I can work, but please remember to commit
  commit()

或者

  useSomeLogic() // just fine, I'll start the session and do you work for you and commit

我喜欢精心打包的可重用代码,这就是为什么我会从特定于传输的模块中重构内容。