2014-11-04 82 views
0

想象一下使用實體框架6以下操作:TransactionScope是否適合在Entity Framework事務中包含副作用?

// operations on some entities 

// send an email 
// write to a file 

db.SaveChanges(); 

如果db.SaveChanges();失敗,電子郵件不應該交付,該文件不應該被寫入。我的理解是否正確,我需要將所有代碼包裝在TransactionScope中以實現此行爲?像這樣:

using(var transaction = new TransactionScope()) 
{ 
    // operations on entities here 

    // send an email 
    // write to a file 

    db.SaveChanges(); 
    transaction.Complete(); 
} 

回答

4

不行,因爲你有問題:

  • 電子郵件並不跨國。因此,您可以通過編寫一個補償資源管理器來處理此問題,該管理器僅在提交時發送電子郵件 - 使用新的API。但是,如果您通過SMTP發送電子郵件,它將被髮送 - 郵件服務器不會關心您的交易。
  • 文件 - 好,轉錄NTFS正式退役;)但你可以使用它。 CRM(補償資源管理器)和開始時的文件備份可以解決這個問題。

所以,通常 - 這種方法是有效的,但你的兩種情況是非常糟糕的。

在這種特殊情況下,我可能會使用通過SQL Broker(或MSMQ)控制的單獨排隊業務事務,以在提交完成後啓動其他2個操作。

+0

因此,我應該安排副作用,由獨立的工作人員通過支持事務的消息隊列(例如Azure Service Bus)運行,以便使上述方法成爲有效的*和好的方法? – Korijn 2014-11-04 14:11:14

+1

是的。因爲你在這裏是一個商業交易。好的方法是通過消息或工作流 - 而不是System.Transaction實例。這可以補償。企業TX往往很複雜,需要很長時間。如果情景變得更加複雜,我可能會使用工作流程組件。 – TomTom 2014-11-04 14:16:24

相關問題