繁体   English   中英

Spring @Transactional如何“停止”交易

[英]Spring @Transactional how to “stop” transaction

我有一个控制器,该控制器在服务类上调用方法,该方法应执行以下操作:

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

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

我的理解是,将3.转移到同一服务类上的单独方法将无济于事。 用@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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM