【问题标题】:Spring Transactions With Supports Propagation支持传播的 Spring 事务
【发布时间】:2011-09-20 05:42:11
【问题描述】:

我想了解使用传播支持进行弹簧事务的用途。 java 文档提到,如果从事务中调用具有@Transactional(propagation = Propagation.SUPPORTS) 的方法,则它支持该事务,但如果不存在事务,则该方法以非事务方式执行。

不管Propagation.SUPPORTS如何,这不是春季交易的行为吗?

public class ServiceBean { @Transactional(propagation = Propagation.SUPPORTS) public void methodWithSupportsTx() { //perform some database operations } } public class OtherServiceBean { @Transactional(propagation = Propagation.REQUIRED) public void methodWithRequiredTx() { //perform some database operations serviceBean.methodWithSupportsTx(); } }

在上面的代码示例中,不管methodWithSupportsTx()是否有@Transactional(propagation = Propagation.SUPPORTS)注解,它都会在事务中执行,这取决于methodWithRequiredTx()是否有@Transactional注解,对吧?

那么,拥有传播级别 SUPPORTS 的需求/用途是什么?

【问题讨论】:

    标签: spring transactions propagation


    【解决方案1】:

    来自javadoc

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

    因此,这意味着,例如,在 methodWithSupportsTx() 内多次调用 Hibernate 的 SessionFactory.getCurrentSession() 将返回相同的会话。

    【讨论】:

    • 假设methodWithSupportsTx() 没有@Transactional 注释您是想说在事务中调用methodWithSupportsTx() 时不会返回相同的会话吗?
    • @Amit:实际上,如果没有@Transactional,尝试使用典型配置HibernateTransactionManager 调用getCurrentSession() 会产生“没有绑定到线程的休眠会话,并且配置不允许创建非这里是事务性的”例外。
    • 不,我的意思是,如果 methodWithSupportsTx() 方法上没有 @Transactional 注释,并且该方法是从另一个已经在事务中的方法调用的,则休眠时不会返回相同的会话多次调用 Hibernate 的 SessionFactory.getCurrentSession()。这正是我在上面的问题中陈述的示例 - methodWithRequiredTx() 上的 @Transactional 注释创建一个新事务,然后调用 serviceBean.methodWithSupportsTx() 因此由 methodWithSupportsTx() 执行的代码已经在一个事务中,对吧?
    • @Amit:是的,如果在现有事务中调用方法,SUPPORTS 没有任何区别。
    • 好的。所以我的问题是 - 在哪些情况下传播级别支持有用?
    【解决方案2】:

    如果不存在,则必需的事务将创建一个新事务。因此,当您调用 serviceBean.methodWithSupportsTx() 时将进行新事务。如果您的方法是真正的事务性方法,如果不存在事务,您将看到 spring 的错误。

    【讨论】:

    • 我不这么认为。仅当传播级别为 NEVER 时才会引发错误。 PROPAGATION.SUPPORTS 也不会创建新事务。
    猜你喜欢
    • 2017-11-22
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多