整个类的事务注释+不包括单个方法

时间:2013-08-14 13:31:13

标签: spring hibernate jpa transactions jta

我有一个带@Transactional注释的类(而不是为其所有方法标记它)。

虽然我在该类中有一个不应该注释为@Transactional的方法。

我的问题是,我可以在此方法中添加注释以将其标记为“非事务性”吗?或者我应该开始将此类中的每个方法标记为“事务性”,不包括此方法(大量工作)

感谢。

2 个答案:

答案 0 :(得分:28)

要使用不同的事务传播策略。这些存在于枚举Propagation中。您可能想要使用的是

/**
 * Execute non-transactionally, suspend the current transaction if one exists.
 * Analogous to EJB transaction attribute of the same name.
 * <p>Note: Actual transaction suspension will not work on out-of-the-box
 * on all transaction managers. This in particular applies to JtaTransactionManager,
 * which requires the {@code javax.transaction.TransactionManager} to be
 * made available it to it (which is server-specific in standard J2EE).
 * @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
 */
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),

/**
 * Execute non-transactionally, throw an exception if a transaction exists.
 * Analogous to EJB transaction attribute of the same name.
 */
NEVER(TransactionDefinition.PROPAGATION_NEVER), // maybe not this one

所以使用其中任何一个来注释类中的方法。

@Transactional
public class MyTransactionalClass { 
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    public void nonTransactionalMethod() {...}
}

您可以找到所有传播策略here

答案 1 :(得分:0)

很抱歉回答一个已有6年历史的问题,但我注意到被接受的答案实际上并未回答该问题。问题是如何使一种方法表现得好像根本没有用@Transactional进行注释。如果存在这种方法,则该方法将参与事务,否则将以非事务方式执行。它不会暂停现有交易,也不会拒绝执行其中的一项交易,其中一项是接受答案的结果。

要使用的传播方式是Propagation.SUPPORTS(换句话说,用@Transactional(propagation = SUPPORTS)注释该方法。如果存在,则将参与事务;如果没有,则将以非事务方式执行,就像非注释方法会。

并非完全按照Javadoc的说法,完全与完全没有@Transactional批注完全不同。它说:

  

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

     

注意:对于具有事务同步的事务管理器,SUPPORTS与根本没有事务略有不同,因为它定义了将应用同步的事务范围。结果,将为整个指定范围共享相同的资源(JDBC连接,休眠会话等)。请注意,这取决于事务管理器的实际同步配置。

使该方法表现为 exacty 且好像根本没有用@Transactional进行注释的唯一方法是按照OP的建议进行操作:不对类进行注释,而对全部进行注释其他方法,但对于大多数使用而言,则不是必需的,而使用Propagation.SUPPORTS就足够了。