【问题标题】:Reading operations inside NHibernate transactionNHibernate 事务中的读取操作
【发布时间】:2012-10-02 19:55:25
【问题描述】:

根据this question and corresponding answers,强烈建议NHibernate 使用事务,即使是读取操作。我不确定何时获取数据。 假设我们有一个简单的 MSQL Server 数据库读取操作:

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

主题存储库的读取方法只返回值的枚举:

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

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

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

调用 ToList() 将立即发出数据库请求(这意味着 NHibernate 应该运行包含单个读取操作的事务),而不是提交什么?它不会像交易中的新交易吗?提前感谢您的解释。

【问题讨论】:

    标签: c# nhibernate transactions


    【解决方案1】:

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

    另外,请确保您在使用 nhibernate 时阅读此内容(以及其中的其他部分)pitfall of nhibernate。

    【讨论】:

    • 那么在事务中明确包装它们的目的是什么?
    • 在交易结束时,您所有的期货都将通过单次往返数据库来执行
    • 那么,使用ToFuture() 并将每次调用DB 包装在Begin() 和Commit() 中会是最佳解决方案吗?似乎 Eager fetching 使得使用事务对象变得多余,不是吗?
    • Transactions 作为一个结构体,一般来说,是为了让你可以批量更新,也可以批量下载。批量更新意味着如果某些更新失败,您可以控制全有或全无的情况。下载,意味着你可以更好地处理缓存,当然还有批量下载本身的性能
    • 交易结束,是往返发生的时候,所以如果你使用期货,那么你确实需要在交易中进行包装。否则你会得到类似于 IQueryable 的对象 - 它们包含查询但不包含实际数据
    猜你喜欢
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多