2011-07-28 60 views
0

我是nServiceBus的新手。nServiceBus和IsTransactional(false)

如果總線配置了IsTransactional(true)並且處理程序有很多數據庫交互,那麼asp.net mvc應用程序掛起。

這裏 - http://adamfyles.blogspot.com/2010/08/getting-started-with-nservicebus-part-2_25.html - 我發現了一個祕訣: 「IsTransactional(假) - 我們不希望在交易中掛一個web應用程序了,所以關閉這個功能」

它幫助 - 該頁面很快刷新。另一方面,如果發生異常,則msmq隊列將丟失。

讓我來解釋處理程序做什麼 - 它遍歷一些分貝行,生成一個報告並更新「ReportId」上記錄鍵:

foreach(var row in rows) 
{ 
    var reportId = GenerateReport(row); 

    row.ReportId = reportId; 
} 

db.Save(); 

正如我所說的,我是新來nServiceBus 。我需要使用佐賀嗎?我不明白傳奇的。或者,也許我可以這樣做:

foreach(var row in rows) 
{ 
    _bus.Send(new GenerateReportMessage{Id = row.Id}); 
}  

並讓處理程序生成報告並更新行?我如何知道所有記錄都已更新?在這種情況下,Web應用程序是否會掛起「IsTransactional(true)」? (我懷疑是)

我的問題:

  1. 我應該知道,當我使用 'IsTransactional(假)' 的?

  2. 更新大量記錄的最佳方法是什麼?只需在循環中更新它們?我不希望網絡應用程序掛起。

編輯

順便說一句,這個代碼似乎沒有掛Web應用程序,並將其與IsTransactional(真)的作品。

這是一個很好的方法嗎?

using (new TransactionScope(TransactionScopeOption.Suppress)) 
{ 

    foreach(var row in rows.Where(x => x.ReportId != null)) 
    { 
    var reportId = GenerateReport(row); 

    row.ReportId = reportId; 
    } 

    db.Save();  
} 
+0

偏離主題但Udi Dahan在dnrTV上做了一個關於NServiceBus的討論 - http://www.dnrtv.com/default.aspx?showNum=199 – Phill

回答

0

你是正確的,你可能會失去IsTransactional(false)的消息。權衡是,您不在交易邊界中包含Web應用程序。包括它可能會減慢您的網絡應用程序,因爲它會等待從服務器端回退。我建議將消息​​轉發到另一個端點以執行事務性工作或使用內置WCF集成公開事務端點。如果你使用WCF路由,只記得除了錯誤代碼之外,你不能從服務中返回任何東西。它也使用基本的HttpBinding,但是如果你願意,你可以改變它。