Database 处理事务中的多个不可逆操作?

Database 处理事务中的多个不可逆操作?,database,transactions,Database,Transactions,例如,用户执行一些更新操作,需要同时执行三个操作: 更新数据库、发送电子邮件并向其他服务执行网络请求。发送电子邮件和执行网络请求是非事务性的,如果其中一个失败,而另一个成功,我们将处于不正确的状态。是否有处理此问题的常见模式?对我来说,一种常见的模式是创建一个电子邮件表作为电子邮件队列,该表的插入可以轻松地包含在事务中 还有另一个进程读取此电子邮件表并将请求发送到外部进程(smtp服务器、sendgrid等),如果我们从外部进程获得成功响应,则将电子邮件标记为“已发送”。如果出现故障,电子邮件不

例如,用户执行一些更新操作,需要同时执行三个操作:
更新数据库、发送电子邮件并向其他服务执行网络请求。发送电子邮件和执行网络请求是非事务性的,如果其中一个失败,而另一个成功,我们将处于不正确的状态。是否有处理此问题的常见模式?

对我来说,一种常见的模式是创建一个电子邮件表作为电子邮件队列,该表的插入可以轻松地包含在事务中

还有另一个进程读取此电子邮件表并将请求发送到外部进程(smtp服务器、sendgrid等),如果我们从外部进程获得成功响应,则将电子邮件标记为“已发送”。如果出现故障,电子邮件不会标记为“已发送”,可以重试。可能存在这样一种情况:电子邮件发送成功,但网络中出现错误,导致响应失败,重试可能会发送重复的电子邮件,但这种情况很少见,并且不会导致问题

您还可以查看类似模式的数据库电子邮件:

我们可以用同样的想法发送网络请求,进一步扩展这种模式。你可以看看这个