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

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

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

Propagation.REQUIRED -> 如果当前没有事务存在,则使用当前事务,否则创建一个新的事务。 - Romas Augustinavičius
1
rollbackFor = Exception.class -> 这意味着如果在事务期间抛出“Exception.class”或任何继承此类的异常,整个事务将被回滚。没有进行任何更改。 - Romas Augustinavičius
3个回答

9
@Transactional(propagation=Propagation.REQUIRED)@Transactional(rollbackFor = Exception.class)大致相同。因为propagation=Propagation.REQUIRED默认值。所以它们等价于@Transactional(propagation=Propagation.REQUIRED)@Transactional(propagation=Propagation.REQUIRED, rollbackFor = Exception.class)
唯一的区别在于没有rollbackFor = Exception.class时,它只会回滚RuntimeExceptionError,而不是其他异常。(在使用EJB时,JEE的行为也已经被翻译到Spring中)。
这也在@Transactional的javadoc中解释了。

请再次阅读...它表明 -> 没有 rollbackFor... - M. Deinum

1
首先,默认情况下,如果您编写或不编写 propagation,它始终存在。如果您编写了 rollbackFor,则在发生异常时事务将回滚。
这里有一个链接可以提供更多帮助:@Transactional

0

propagationrollbackFor关注的是不同的方面,propagation关注事务需要或创建的方式rollbackFor关注指定异常发生时是否回滚已存在的事务

请参考@Propagation docs以获取更多详细信息。

由于默认传播级别为Propagation.REQUIRED,因此你提出的两个注解之间的主要区别在于是否对异常(已检查异常)进行回滚。


我认为M.Deinum的回答是这个问题的恰当答案。(https://dev59.com/ULLma4cB1Zd3GeqPWSZm#54900186) - Prasanth Rajendran
@PrasanthRajendran所说的是正确的,但是可以通过组合做更多的事情。 - ltwonders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接