【问题标题】:Spring non-transactional nested method inside @transactional is the same as @transactional propagation = support@transactional 内部的 Spring 非事务嵌套方法与 @transactional 传播 = 支持相同
【发布时间】:2018-07-04 08:26:11
【问题描述】:

i) 有什么区别吗,1) 如果我从 @transactional 内部调用非事务性方法,并且 2) 调用传播级别 = 支持同一 @transactional 方法的 @transactional?

ii) 如果对问题 i) 的回答是相同的 bean 还是不同的,有什么不同吗?

谢谢

【问题讨论】:

    标签: spring transactions spring-transactions


    【解决方案1】:

    i) 有什么区别吗,

    1) 如果我从@transactional AND 内部调用非事务性方法

    如果你在事务中调用一个方法,没有任何设置,事务将跨越到调用方法。

    2) 调用 @transactional,传播级别 = 支持来自同一 @transactional 方法?

    Propagation.SUPPORTS注解的方法会在当前事务中执行,就像调用非事务方法一样。

    设置@Transactional(propagation = Propagation.SUPPORTS) 和不设置@Transactional 之间的唯一区别在javadoc 中注明:

    注意:对于具有事务同步的事务管理器,PROPAGATION_SUPPORTS 与根本没有事务略有不同,因为它定义了同步将适用的事务范围。因此,相同的资源(JDBC 连接、Hibernate Session 等)将在整个指定范围内共享。请注意,这取决于事务管理器的实际同步配置。

    ii) 如果对问题 i) 的回答是相同的 bean 还是不同的,有什么不同吗?

    Spring@Transactional注解默认使用AOP代理。

    当您在同一个类中从methodA 调用methodB 时,不会为methodB 激活AOP 代理(即完全忽略methodB 中的@Transactional 注释)。

    当你从不同类调用时,行为与i)相同

    【讨论】:

    • ---它定义了同步将应用的事务范围。因此,相同的资源(JDBC 连接、Hibernate Session 等)将在整个指定范围内共享---
    • 你的意思是,在非事务性嵌套方法中,它不会访问这些对象:JDBC Connection、Hibernate Session 等?
    猜你喜欢
    • 2011-02-21
    • 2023-03-20
    • 1970-01-01
    • 2018-05-14
    • 2010-12-09
    • 2012-01-19
    • 2015-07-24
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多