@Transactional(rollbackFor = Exception.class)和@Transactional(propagation = Propagation.REQUIRED)有什么区别

时间:2019-02-27 04:49:14

标签: java spring hibernate spring-boot java-ee

@Transactional(rollbackFor = Exception.class) 
public void foo1() {
    `/**Some Code**/`
}

@Transactional(propagation=Propagation.REQUIRED)
public void foo2() {
    `/**Some Code**/`
}

3 个答案:

答案 0 :(得分:2)

@Transactional(propagation=Propagation.REQUIRED)@Transactional(rollbackFor = Exception.class)大致相同。 propagation=Propagation.REQUIREDthe default。因此请牢记,它们等效于@Transactional(propagation=Propagation.REQUIRED)@Transactional(propagation=Propagation.REQUIRED, rollbackFor = Exception.class)

唯一的区别是,如果没有rollbackFor = Exception.class,它将仅针对RuntimeExceptionError进行回滚,而不会发生其他异常。 (对于使用EJB的JEE来说是相同的,并且该行为也已转换为Spring)。

javadoc of @Transactional中也对此进行了说明。

答案 1 :(得分:1)

首先,默认情况下,无论是否写入,propagation始终存在。如果您写rollbackFor,那么如果发生异常,事务将被回滚。

以下是更多帮助的链接:@Transactional

答案 2 :(得分:0)

propagationrollbackFor关注的重点不同,propagation关心交易如何需要或创建的方式rollbackFor关心指定的异常发生时,是否存在的事务会回滚

请参阅@Propagation docs以获得更多详细信息。

由于默认传播级别为Propagation.REQUIRED,因此问题中两个注释之间的主要区别在于是否回滚Exception(已检查的Exception)。