.net NHibernate:在一个会话中执行多个事务

eivnm1vs  于 2023-05-19  发布在  .NET
关注(0)|答案(5)|浏览(170)

我想知道在单个会话上创建多个事务是否有任何问题,如下所示:

using (var session = factory.OpenSession())
{
    using (var trans1 = session.BeginTransaction())
    {
        .....
        trans1.commit();
    }

    using (var trans2 = session.BeginTransaction())
    {
        .....
        trans2.commit();
    }

    using (var trans3 = session.BeginTransaction())
    {
        .....
        trans3.commit();
    }

    using (var trans = session.BeginTransaction())
    {
        .....
        // trans1.commit();
    }
}

这是可能的,还是必须为每个事务打开一个新的会话对象?
谢谢你的帮助。

6yt4nkrj

6yt4nkrj1#

是的,你做的很好。
nhibernate不支持的是多个嵌套事务。

x7yiwoj4

x7yiwoj42#

即使在NHibernate中,在一个会话上有多个事务也是不常见的。另外,根据个人经验,我可以说在任何其他情况下重用会话都不是一个好主意。
我建议尽可能保持工作流程简单,以避免任何副作用:

  • 公开会议
  • 公开交易
  • 使用您的实体
  • 提交事务
  • 异常情况下的回滚
  • 关闭/刷新会话(始终)
idv4meu8

idv4meu83#

Web环境中最常见的策略是每个请求都有会话。
当它涉及到事务时,它实际上取决于您的用例。
你所做的一切都很好,否则nhibernate不会将session和transaction分开。
但这又取决于您的业务情况。
我建议你用IDisposable Package session.BeginTransaction(),所以在Dispose上你要确保提交事务。

aiqt4smr

aiqt4smr4#

没有问题,虽然这是不寻常的。请记住,如果任何事务回滚,则应丢弃会话。

mw3dktmi

mw3dktmi5#

我想进一步补充的一点是,NHibernate不能处理重叠的事务,即使它们来自不同的会话(例如全局DB服务器和本地DB文件)。因此,对于同步,您始终需要创建对象的真实的示例,并且不能通过查询传递它们。

相关问题