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();
}
不,因为您有问题:
- 电子邮件不是跨国的。因此,您可以通过编写一个补偿资源管理器来处理这一问题,该管理器只在提交时发送电子邮件-使用新的API。但如果你通过SMTP发送电子邮件,它就会被发送——邮件服务器不会关心你的交易
- 文件-嗯,转录NTFS正式退役;)但你可以用它。CRM(补偿资源管理器)和一开始的文件备份可以处理这个问题
所以,总的来说,这种方法是有效的,但你的两个案例真的很糟糕。
在这种特殊的情况下,一旦提交完成,我可能会使用通过SQL Broker(或MSMQ)控制的单独排队的业务事务来启动其他2个操作。