0

この質問と対応する回答によると、NHibernate では読み取り操作でもトランザクションを使用することを強くお勧めします。データのフェッチがいつ行われるかはわかりません。MSQL Server データベースからの単純な読み取り操作があるとします。

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

トピック リポジトリの read メソッドは、単に値の列挙を返します。

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

私が理解しているように、ToList() を呼び出すか、その他のデータ操作を行うまで、NHibernate は (遅延初期化に従って) データベースから値を抽出しません。しかし、このRead呼び出しをトランザクションにラップし、トランザクションがコミットされるまで ToList() を呼び出してデータをフェッチするとどうなるでしょうか?

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

ToList() を呼び出すと、すぐにデータベース要求が行われます (これは、NHibernate が単一の読み取り操作を含むトランザクションを実行する必要があることを意味します)、何がコミットされるのでしょうか? そして、トランザクション内の新しいトランザクションのようなものではないでしょうか? 事前にご説明いただきありがとうございます。

4

1 に答える 1

2

読み取り操作はすぐに実行されます。それらを延期したい場合は、この.ToFuture()方法の使用を検討する必要があります。

また、 nhibernateを使用している間は、nhibernateのこの(および他の部分の)落とし穴を必ず読んでください。

于 2012-10-02T11:55:25.043 に答える