这段代码可以做些坏事吗?我在一个项目中找到了它,并且不知道它是否会导致一些疯狂的错误(死锁,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();
}
}
}
}
答案 0 :(得分:0)
这应该没问题。我相信我过去做过这样的事情。您需要注意的唯一事情是,如果您修改内部会话中的对象,那么如果已经加载了相同的对象,则这些更改不会自动反映在外部会话中。
话虽如此,如果你不需要这样做,那么我会避免它。通常我会在使用NHibernate时推荐基于AOP的事务管理。这将允许您的内部组件轻松地与外部组件中的事务连接。但是,为了做到这一点,你需要使用支持它的DI容器,例如Spring.NET或Castle。