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

时间:2014-02-05 10:58:53

标签: nhibernate fluent-nhibernate

这段代码可以做些坏事吗?我在一个项目中找到了它,并且不知道它是否会导致一些疯狂的错误(死锁,DB中的超时,......)。这样的代码甚至在线程中也可以在程序中多次执行。

非常感谢

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();
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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