我有一个带有@Transactional
注释的类(而不是为它的所有方法标记它)。
尽管我在该类中有一个不应注释为的方法@Transactional
。
我的问题是我可以在此方法中添加注释以将其标记为“非事务性”吗?或者我应该开始将这个类中的每个方法标记为“事务性”,不包括这个方法(很多工作)
谢谢。
我有一个带有@Transactional
注释的类(而不是为它的所有方法标记它)。
尽管我在该类中有一个不应注释为的方法@Transactional
。
我的问题是我可以在此方法中添加注释以将其标记为“非事务性”吗?或者我应该开始将这个类中的每个方法标记为“事务性”,不包括这个方法(很多工作)
谢谢。
有不同的事务传播策略可供使用。这些存在于 enum 中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() {...}
}
您可以在此处找到所有传播策略。
很抱歉回答一个六年前的问题,但我注意到接受的答案实际上并没有回答这个问题。问题是如何让一个方法表现得好像它根本没有注释一样@Transactional
。如果有一个事务,这样的方法将参与事务,如果没有,则以非事务方式执行。它不会暂停现有事务,或者如果有一个事务则拒绝执行,其中一个将是接受答案的结果。
要使用的传播是Propagation.SUPPORTS
(换句话说,用 注释方法@Transactional(propagation = SUPPORTS)
。如果有,这将参与事务,如果没有,则以非事务方式执行,就像非注释方法一样。
并不是说根据 Javadoc,它与根本没有注释并不完全相同。@Transactional
它说:
支持当前事务,如果不存在则以非事务方式执行。类似于同名的 EJB 事务属性。
注意:对于具有事务同步的事务管理器,SUPPORTS 与根本没有事务略有不同,因为它定义了同步将适用的事务范围。因此,相同的资源(JDBC 连接、Hibernate Session 等)将在整个指定范围内共享。请注意,这取决于事务管理器的实际同步配置。
使该方法表现得完全像根本没有注释的唯一方法是按照@Transactional
OP 的建议进行操作:不要注释类,而是注释所有其他方法,但对于大多数用途来说,这不是必需的,并且使用Propagation.SUPPORTS
就足够了。