Spring @Transactional 如何"stop" 事务
Spring @Transactional how to "stop" transaction
我有一个调用服务方法的控制器 class 应该执行以下操作:
- 更新数据库(使用 DAO 1)
- 更新数据库(使用 DAO 2)
- 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")
,并进行回滚。
我有一个调用服务方法的控制器 class 应该执行以下操作:
- 更新数据库(使用 DAO 1)
- 更新数据库(使用 DAO 2)
- 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")
,并进行回滚。