2012-10-02 71 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