【问题标题】:How to manage business transactions如何管理业务交易
【发布时间】:2015-03-27 21:31:49
【问题描述】:

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

例如,如果我有:

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

服务器在保存user 后死机,但无法发送电子邮件,那么我该如何恢复交易?

此外,让事情变得更复杂,假设我们先发送电子邮件,然后持久化用户,然后发送电子邮件,但用户没有持久化。由于该交易不可能被撤销,因此必须有一种方法来管理所有“假设”案例。

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

Java 是否有办法管理此类问题?我知道这可以被视为一个开放式问题,但问题是我实际上不知道从哪里开始了解这个问题。

【问题讨论】:

  • 春天你有@transactional annotionas,他们关心事务......对于特定场景你可以尝试捕获异常并决定做什么。
  • 这不只是为了数据库的东西吗?
  • 当然可以,事务复杂且困难,不能只说“嘿Java,回滚”
  • 因为您无法恢复正在发送的电子邮件这一事实,它必须是此类事务中的最后一个操作。没有充分的理由先发送电子邮件。
  • @libik:实际上我希望我能说更多的话,比如“嘿 Java,恢复你没有完成的线程”

标签: java spring jakarta-ee transactions


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2012-08-10
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多