首页 文章

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

提问于
浏览
15

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

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

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

  • 需要SUPPORTS传播的情况有哪些?

  • 支持传播有什么意义?

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

3 回答

  • 4

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

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

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

  • 6

    它与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);
    }
    
  • 0

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

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

相关问题