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

时间:2013-02-27 19:01:11

标签: java spring java-ee ejb

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

  

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

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

  • 需要SUPPORTS传播的情况有哪些?
  • 支持传播有什么意义?

任何人都可以提供支持实际有用的真实世界示例/场景吗?

3 个答案:

答案 0 :(得分:6)

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

请记住,这些可以在API和实现上声明。因此,即使您将其放在那里并且不做任何操作之间的用例没有太大差异,它仍然为API作者增加了价值,以指定哪些操作可以包含在事务中,而不是可能调用的操作一个不参与交易的外部系统。

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

答案 1 :(得分:4)

在select操作中,它与readOnly=true Transactional标志形成良好的配对,尤其是在使用ORM时:

@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);
}

答案 2 :(得分:0)

根据此问题Improve performance with Propagation.SUPPORTS for readOnly operation,您不应使用Propagation.SUPPORTS设置只读事务:

它并不清楚这种改变实际上会提高性能。这方面有多个方面。首先是链接的文章过时且存在难以置信的缺陷,因为它积极地简化了事情。如果你愿意,我可以详细说明,但我现在就把它留在那里。这里有很多东西可以用于执行性能。如果没有正在进行的事务,readOnly标志既不会传播到JDBC驱动程序(这将导致许多数据库未被应用的优化),也不会在Spring的JPA资源管理代码中应用优化,例如明确关闭刷新,如果应用,可以在您阅读大量数据时显着提高性能。