Java 虽然引发了异常,但事务未回滚

Java 虽然引发了异常,但事务未回滚,java,spring,exception,spring-transactions,Java,Spring,Exception,Spring Transactions,目前,我们在应用程序中面临一个与spring事务相关的问题。 如您所见,在deleteRecord()中,我们正在执行一个DB操作。但是在下一行 抛出一个业务异常 预期行为(据我所知): 当从下一行抛出异常时,应该回滚DB操作 实际行为: 它不会后退。正在将数据插入到表中 问题: 为什么事务没有回滚?我不认为这是因为抓块 因为deleteRecord()将在新事务中执行。如果我错了,请纠正我 代码: class A { void myMethod() { for(int

目前,我们在应用程序中面临一个与spring事务相关的问题。 如您所见,在
deleteRecord()
中,我们正在执行一个DB操作。但是在下一行 抛出一个业务异常

预期行为(据我所知): 当从下一行抛出异常时,应该回滚DB操作

实际行为: 它不会后退。正在将数据插入到表中

问题: 为什么事务没有回滚?我不认为这是因为抓块 因为
deleteRecord()
将在新事务中执行。如果我错了,请纠正我

代码:

class A {
    void myMethod() {
        for(int i=0 ; i<count ; i++) {
            try {
                    deleteRecord();
                } catch(Exception e) {
                    log.error("Exception caught");

                }

        }

}

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    deleteRecord() throws Exception{
        line 1 : deleting record 
        line 2 : Throwing business exception 

    }
}
A类{
void myMethod(){
对于(int i=0;i更改为

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)

Spring文档说明如下:

虽然EJB的默认行为是EJB容器在系统异常(通常是运行时异常)时自动回滚事务,但EJB CMT不会在应用程序异常(即除java.rmi.RemoteException之外的已检查异常)时自动回滚事务。虽然声明性事务管理的Spring默认行为遵循EJB约定(只有在未检查的异常情况下才会自动回滚),但定制此操作通常很有用

在默认配置中,Spring框架的事务 在这种情况下,基础结构代码仅标记要回滚的事务 对于运行时,未检查的异常;也就是说,当抛出异常时 是RuntimeException的实例或子类- 默认情况下-导致回滚)。已检查并引发的异常 在默认情况下,来自事务性方法的操作不会导致回滚 配置

见16.5.3:

这表示事务的默认行为将仅回滚
RuntimeException
s。如果您有自己的业务异常(可能是选中的异常),则必须显式命名事务应回滚的异常类:

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = YOUREXCEPTION.class)

这是因为@Transaction方法由同一类中的方法调用,如果未将Spring配置为使用AspectJ,则该方法不起作用


即使我不使用
rollboor
它也应该正常工作?这取决于您的CustomException类。如果您不使用“rollboor”,则默认行为是“回滚RuntimeException和Error,但不回滚checked Exception”,明白了。谢谢!