由于交易不完整,我的代码中发生了一些虚假活动,我不知道该怎么办。
例如,如果我有:
User user = new User();
userService.save(user);
Email email = new Email(user, "Welcome!");
emailService.send(email);
并且服务器在保存user
后死亡,但无法发送电子邮件,那么我该如何还原交易呢?
此外,为了使事情变得更加复杂,我们先说我们先发送了电子邮件,然后又将用户保留了下来并发送了电子邮件,但用户并没有坚持下去。由于该交易无法逆转,因此必须有一种管理所有"假设"案例。
问题在于它不一定只与电子邮件有关,它可能是任何东西 - 电子邮件,短信,银行交易,网络服务电话,数据库程序调用等......
Java有办法管理这些问题吗?我知道这可以看作是一个开放式问题,但问题是我实际上并不知道从哪里开始了解这个问题。
答案 0 :(得分:1)
我可能会为要发送的电子邮件创建一个单独的表,并让Quartz或其他任务调度程序进行电子邮件发送。
在这种情况下,您可以同时插入用户和电子邮件表。看看这个:MySQL Insert into multiple tables? (Database normalization?)
因此,当您提交用户时,电子邮件将同时提交,否则它们都将失败。
然后,您的调度程序可以每xx分钟查看一次电子邮件表,并软/硬删除成功发送的电子邮件。如果您软删除它们,您还可以获得已发送电子邮件的历史记录。这种使用电子邮件调度程序的方法对我来说也很有意义,因为发送电子邮件需要互联网连接,而不像在数据库上创建用户。