如何管理业务交易

时间:2015-03-27 21:31:50

标签: java spring java-ee transactions

由于交易不完整,我的代码中发生了一些虚假活动,我不知道该怎么办。

例如,如果我有:

User user = new User();
userService.save(user);
Email email = new Email(user, "Welcome!");
emailService.send(email);

并且服务器在保存user后死亡,但无法发送电子邮件,那么我该如何还原交易呢?

此外,为了使事情变得更加复杂,我们先说我们先发送了电子邮件,然后又将用户保留了下来并发送了电子邮件,但用户并没有坚持下去。由于该交易无法逆转,因此必须有一种管理所有"假设"案例。

问题在于它不一定只与电子邮件有关,它可能是任何东西 - 电子邮件,短信,银行交易,网络服务电话,数据库程序调用等......

Java有办法管理这些问题吗?我知道这可以看作是一个开放式问题,但问题是我实际上并不知道从哪里开始了解这个问题。

1 个答案:

答案 0 :(得分:1)

我可能会为要发送的电子邮件创建一个单独的表,并让Quartz或其他任务调度程序进行电子邮件发送。

在这种情况下,您可以同时插入用户和电子邮件表。看看这个:MySQL Insert into multiple tables? (Database normalization?)

因此,当您提交用户时,电子邮件将同时提交,否则它们都将失败。

然后,您的调度程序可以每xx分钟查看一次电子邮件表,并软/硬删除成功发送的电子邮件。如果您软删除它们,您还可以获得已发送电子邮件的历史记录。这种使用电子邮件调度程序的方法对我来说也很有意义,因为发送电子邮件需要互联网连接,而不像在数据库上创建用户。