NHibernate现有事务中有事务的新会话

NHibernate现有事务中有事务的新会话,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,这个代码会造成一些不好的事情吗?我在一个项目中发现了它,不知道它是否会导致一些疯狂的错误(死锁、数据库超时等等)。这样的代码在程序中多次并行执行,甚至在线程中也是如此 非常感谢 class first { void doSomething { using (ITransaction transaction = session.BeginTransaction){ var foo = new second(); foo.d

这个代码会造成一些不好的事情吗?我在一个项目中发现了它,不知道它是否会导致一些疯狂的错误(死锁、数据库超时等等)。这样的代码在程序中多次并行执行,甚至在线程中也是如此

非常感谢

class first {
    void doSomething { 
        using (ITransaction transaction = session.BeginTransaction){

            var foo = new second();
            foo.doInNewTransaction(); //inner transaction in new session

            transaction.Commit();
          } 
    }
}

class second {
    void doInNewTransaction(){
        using (Session session = new Session()){
            using (ITransaction transaction = session.BeginTransaction){

                //do someting in database   
                transaction.Commit();
            }
        }
    }
}

这应该没问题。我相信我过去也做过类似的事情。唯一需要注意的是,如果在内部会话中修改对象,那么如果已加载相同的对象,这些更改将不会自动反映在外部会话中


话虽如此,如果你不需要这样做,那么我会避免这样做。通常,我建议在使用NHibernate时使用基于AOP的事务管理。这将允许您的内部组件轻松地加入到来自外部组件的事务中。但是,为了做到这一点,您需要使用支持此功能的DI容器,例如Spring.NET或Castle。

您的代码目前并没有做“坏”的事情,但是您可以添加这样做的代码。你不能用代码构造来防止“坏事情”,只有那些知道自己在做什么的开发人员才能做到。当然,我需要知道这种做法总体上是否不好——我的意思是……在现有事务中打开新会话和事务