【问题标题】:nhibernate and nested transactions休眠和嵌套事务
【发布时间】:2010-09-20 19:01:41
【问题描述】:

我知道 nhibernate 不支持嵌套事务。

假设我得到了这样的东西:

  1. UserService.BeginTransaction(在当前会话中)
  2. UserService.Save
  3. 用户服务->FeedService
    1. FeedService.BeginTransaction(在当前会话中)
    2. FeedService.Save
    3. FeedService.Commit(在 #3.1 中返回的事务上)
  4. 用户服务->地址服务
    1. AddressService.BeginTransaction(在当前会话中)
    2. AddressService.Save
    3. AddressService.Commit(在 #4.1 中返回的事务上)
  5. UserService.Commit(在 #1 中返回的事务上)

在 #3.3 中调用 commit 时会发生什么,事务是否已提交?我需要一切才能成功或失败。

【问题讨论】:

    标签: .net nhibernate transactions nested nested-transactions


    【解决方案1】:

    正如 Jamie 所说,应在更高级别管理事务以避免这种情况。

    但是,如果您出于某种原因必须将开始/提交保持在“服务”级别,则可以将所有内容包装在 TransactionScope 中,只有在所有内容之后您才会使用 Complete()成功了。

    【讨论】:

    • 如果不在服务级别,您建议在哪里保持开始/提交?
    • @Kugel 它可以是一个基础设施层,提供诸如每个请求或每个调用事务之类的东西,也可以是一个协调器(如控制器)
    【解决方案2】:

    是的。 3.1 中的 BeginTransaction 调用不会做任何事情,因为已经有一个活动事务。如果您希望所有操作都参与同一个事务,则不要在 3.x 和 4.x 中调用 Begin/End Transaction。

    我的建议是不要在服务或存储库类中使用事务。我要么在 UI 级别控制事务,要么创建一个封装业务流程的类。

    【讨论】:

    • 它添加了一个我很好的 NHibernate 依赖项。我们的 UI 代码直接使用 ISession,或者将其传递给存储库/工厂构造函数,以便多个存储库可以参与事务。
    猜你喜欢
    • 2016-03-19
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    相关资源
    最近更新 更多