2014-11-04 49 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

相关问题