何时使用 Spring @Transactional(propagation = Propagation.SUPPORTS)?

2022-09-01 14:46:42

根据Spring javadoc@Transactional(propagation = Propagation.SUPPORTS)

支持当前事务,如果不存在,则以非事务方式执行。类似于同名的 EJB 事务属性。

似乎我可以只声明非事务性的方法,并且只是完成它,所以我的问题是。

  • 在哪些情况下需要支持传播?
  • 支撑传播的意义何在?

任何人都可以举一个真实的例子/场景,其中支持实际上是有用的?


答案 1

我能想到的最简单的例子是将一些内容发送到JMS服务器的方法。如果处于事务上下文中,则希望将消息耦合到事务作用域。但是,如果还没有一个事务在运行,为什么还要调用事务服务器并启动一个事务服务器来执行一次性消息呢?

请记住,这些可以在API和实现上声明。因此,即使将它放在那里和什么都不放在那里对你的用例没有太大区别,它仍然为API作者增加了价值,以指定哪些操作能够包含在事务中,而不是调用不参与事务的外部系统的操作。

这当然是在JTA的背景下。该功能在事务仅限于资源本地物理数据库事务的系统中实际上没有太多实际用途。


答案 2

它与选择操作上的事务标志一起形成一个很好的对,特别是当使用ORM时:readOnly=true

@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
public Pojo findPojo(long pojoId) throws Exception {
   return em.find(Pojo.class, pojoId);
}

在这种情况下,如果还没有仅用于执行选择操作的事务,请确保不要支付创建新事务的代价。

虽然如果你已经处于这种思维过程中,你甚至可以考虑完全放弃事务方面:

public Pojo findPojo(long pojoId) throws Exception {
   return em.find(Pojo.class, pojoId);
}

推荐