TransactionScope是否适合在实体框架事务中包含副作用

本文关键字:事务 包含 副作用 框架 实体 是否 TransactionScope | 更新日期: 2023-09-27 18:29:08

想象一下使用实体框架6的以下操作:

// 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();
}

TransactionScope是否适合在实体框架事务中包含副作用

不,因为您有问题:

  • 电子邮件不是跨国的。因此,您可以通过编写一个补偿资源管理器来处理这一问题,该管理器只在提交时发送电子邮件-使用新的API。但如果你通过SMTP发送电子邮件,它就会被发送——邮件服务器不会关心你的交易
  • 文件-嗯,转录NTFS正式退役;)但你可以用它。CRM(补偿资源管理器)和一开始的文件备份可以处理这个问题

所以,总的来说,这种方法是有效的,但你的两个案例真的很糟糕。

在这种特殊的情况下,一旦提交完成,我可能会使用通过SQL Broker(或MSMQ)控制的单独排队的业务事务来启动其他2个操作。