I would just change the transaction processing logic as follows:
public IEnumerable<Data> GetData() { var transaction = Session.BeginTransaction(); bool rollback = true; try { IQuery q = CreateQuery(session); foreach (var result in q.Enumerable()) { yield return ProjectResult(result); } rollback = false; session.Commit(); } finally { if (rollback) { transaction.Rollback(); } transaction.Dispose(); } }
Or, if your transaction supports the idea of "cancel the rollback method if it did not complete":
public IEnumerable<Data> GetData() { using (var transaction = Session.BeginTransaction(); { IQuery q = CreateQuery(session); foreach (var result in q.Enumerable()) { yield return ProjectResult(result); }
Jon skeet
source share