/**
* 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() {...}
}
2条答案
按热度按时间uyhoqukh1#
可以使用不同的事务传播策略。它们存在于枚举
Propagation
中。你可能想用的是因此,在类中使用这两种方法中的任何一种来注解方法。
您可以找到所有的传播策略here。
rsaldnfx2#
使用
NOT_SUPPORTED
或NEVER
的传播的accepted answer实际上并没有回答这个问题。问题是如何让一个方法的行为就像它根本没有用@Transactional
注解一样。如果存在事务,则这样的方法将参与事务,或者如果不存在事务,则以非事务方式执行。它不会暂停现有的事务,或者拒绝执行(如果有),其中一个将是接受答案的结果。要使用的传播是
Propagation.SUPPORTS
(换句话说,用@Transactional(propagation = SUPPORTS)
注解该方法)。如果有事务,它将参与其中,如果没有,则以非事务方式执行,就像一个未注解的方法一样。这并不是说根据Javadoc,它与根本没有
@Transactional
注解并不完全相同。上面写着:支持当前事务,如果不存在,则以非事务方式执行。类似于EJB事务的同名属性。
注意:对于具有事务同步的事务管理器,CANORTS与没有事务略有不同,因为它定义了同步将应用的事务范围。因此,相同的资源(JDBC连接、Hibernate会话等)将在整个指定范围内共享。注意,这取决于事务管理器的实际同步配置。
让方法表现得 exacty 就好像它根本没有用
@Transactional
注解一样的唯一方法是按照OP建议的那样做:不要注解类,但注解所有其他方法,但对于大多数用途来说,这是不必要的,使用Propagation.SUPPORTS
就足够了。