Spring @Transactional 如何"stop" 事务

Spring @Transactional how to "stop" transaction

我有一个调用服务方法的控制器 class 应该执行以下操作:

  1. 更新数据库(使用 DAO 1)
  2. 更新数据库(使用 DAO 2)
  3. sendEmail(使用电子邮件服务)

(1) 和 (2) 应该是原子的,如果两者都成功,则应该发送电子邮件。如果我用 @Transactional 注释服务方法,即使数据库更新失败也会发送电子邮件(这是不需要的)。此外,如果电子邮件失败,数据库更新将回滚(这也不是所希望的)。

我的理解是将 3. 移动到同一服务上的单独方法 class 无济于事。使用@Transactional 和不同的传播行为(例如 NEVER 或 REQUIRES_NEW)注释 sendEmail 方法似乎也无济于事。

是否可以通过适当的注释实现该行为?

您需要为前两个步骤进行交易,然后提交交易,最后发送电子邮件。最简单的方法是引入一个额外的 bean

控制器:

beanA.process();

豆A:

// not transactional
public void process() {
    beanB.updateDatabase();
    sendEmail();
}

private void sendEmail() {
    ...
}

B豆:

@Transactional
public void updateDatabase() {
    dao1.update();
    dao2.update();
}

如果要停止事务,则抛出新的RunTimeException("log message here"),并进行回滚。