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