この質問と対応する回答によると、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 が単一の読み取り操作を含むトランザクションを実行する必要があることを意味します)、何がコミットされるのでしょうか? そして、トランザクション内の新しいトランザクションのようなものではないでしょうか? 事前にご説明いただきありがとうございます。