我有一个带@Transactional
注释的类(而不是为其所有方法标记它)。
虽然我在该类中有一个不应该注释为@Transactional
的方法。
我的问题是,我可以在此方法中添加注释以将其标记为“非事务性”吗?或者我应该开始将此类中的每个方法标记为“事务性”,不包括此方法(大量工作)
感谢。
答案 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
就足够了。