我进行了一次采访,在采访中,我被问到以下问题:当@Transactional
批注同时添加到类和一个方法时,而不是在其他方法上,我怎么只能这种方法交易有效吗?
例如:
@Transactional
public class ClassA {
@Transactional
private void methodA() {
}
private void methodB() {
}
private void methodC() {
}
}
那么,如何确保该类中的其他事务不生效?这个问题的重点是什么?
答案 0 :(得分:2)
您可以更改内部事务的传播类型:
@Transactional(propagation = Propagation.REQUIRES_NEW)
这将创建一个新的内部事务并暂停外部事务。如果您需要提交内部事务,但是如果其他地方有任何问题,则需要外部事务回滚,这可能会很有用。
我从没使用过类作用域的@Transactional
,但实际上,了解propagation
属性非常有用。
我在几种情况下都使用它来覆盖默认值Propagation.REQUIRED
,该默认值表示:“如果尚不存在,则创建一个新交易-否则支持”,根据文档。
顺便说一句,我正在使用:
org.springframework.transaction.annotation.Transactional
因此,如果您使用其他@Transactional
还要注意,内部和外部事务区别是基于HQL的,因此您不必担心所使用的SQL方言。