2012-10-02 34 views
0

根据this question and corresponding answers,强烈建议NHibernate甚至在读操作时使用事务。我不确定提取数据的时间。 想象一下我们从MSQL Server数据库的一个简单的读取操作:NHibernate事务内部的读操作

var topics = _topicRepository.Read(0, 10); 

其中主题库的读取方法只是返回值的枚举:

public IEnumerable<Topic> Read(int beginIndex, int amount) 
{ 
    return _session.Query<Topic>().Skip(beginIndex).Take(amount); 
} 

据我了解,NHibernate的将不会从提取值数据库(根据延迟初始化),直到我们调用ToList()或对数据进行任何其他操作。但是当我们调用ToList()来调用事务并获取数据直到事务被提交时,发生了什么?

transaction.Begin(); 
var topics = _topicRepository.Read(0, 10).ToList(); 
transaction.Commit(); 

调用ToList()将会使数据库请求立即(这意味着NHibernate的应该运行的交易,其中将包含单个读操作),比什么将要COMMITED?难道它不会像交易内部的新交易一样吗?预先感谢您的解释。

回答

2

阅读操作将立即进行。如果你想推迟它们,你应该考虑使用.ToFuture()方法。

此外,请确保您阅读此(及其他部分)pitfall of nhibernate而您使用nhibernate。

+0

在交易中包装它们的目的是什么? – Eadel

+0

在交易结束时,您的所有期货将执行一次往返db –

+0

那么,使用'ToFuture()'并在'Begin()'中包装每个DB的调用是否是最好的解决方案,并且'提交()'?看起来,急切的提取使得事务对象变得冗余,不是吗? – Eadel