spring 整个类上的translation注解+排除单个方法

0md85ypi  于 2023-09-29  发布在  Spring
关注(0)|答案(2)|浏览(147)

我有一个带有@Transactional注解的类(而不是为它的所有方法标记它)。
尽管我在那个类中有一个方法不应该被注解为@Transactional
我的问题是,有没有一个注解可以放在这个方法中,将其标记为“非事务性”?或者我应该开始将这个类中的每个方法都标记为“transactional”,但不包括这个方法(大量工作)
谢谢.

uyhoqukh

uyhoqukh1#

可以使用不同的事务传播策略。它们存在于枚举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

rsaldnfx

rsaldnfx2#

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

相关问题