[英]Unit of work/Transaction within an application service method?
我了解如何使用实体框架来实现工作单元,并且仅在执行整个单元后才提交更改,但是我该如何进一步呢? 例如,一次交易需要满足以下所有条件
CreateUser(...)
{
//1.) New up user object
//2.) Add newly created object to database
//3.) Send Email
//4.) Commit transaction ( ensures email is successfully sent AND object is created in database, else transaction fails
}
我不太确定如何确保电子邮件的发送和用户在数据库中的保存都在一次事务中完成。 任何意见是极大的赞赏
并非所有资源都是事务性的。 电子邮件就是其中之一。 因此,不能期望在其他资源在事务中失败时会回退发送电子邮件。
有一些替代解决方案:
1)在最后一步调用非事务性资源。
就像您在创建用户示例中所做的一样。 在这种情况下,将检查并通过所有业务约束,失败的唯一原因是基础架构问题,该问题在现实世界中很少发生(需要精心维护)。 在发生基础结构故障时进行一些补偿。 这可以自动或手动完成,具体取决于它发生的频率。 例如,如果发送了电子邮件,但是用户设置被回滚,您可能会告诉他/她,您非常抱歉(这非常重要:P),但是设置有问题,请重试。
2)应用最终一致性
请改用事务性资源来触发该过程。 例如,您可以使用消息传递(如果使用两阶段提交,则为全局事务性)来通知发送电子邮件。
CreateUser(...)
{
//1.) New up user object
//2.) Add newly created object to database
//3.) Publish user setup event by messaging
//4.) Commit transaction ( ensures message is successfully sent AND object is created in database, else transaction fails
}
在任何情况下,故障和不一致都会或多或少地发生。 您需要评估是否可以接受。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.