Java @如果引发异常,则事务性不起作用

Java @如果引发异常,则事务性不起作用,java,mysql,spring,jpa,spring-boot,Java,Mysql,Spring,Jpa,Spring Boot,这是我的spring boot应用程序: @SpringBootApplication @EnableTransactionManagement(proxyTargetClass=true) public class WhizhopApplication { public static void main(String[] args) { SpringApplication.run(WhizhopApplication.class, args); } } 这是我的服务:

这是我的spring boot应用程序:

@SpringBootApplication
@EnableTransactionManagement(proxyTargetClass=true) 
public class WhizhopApplication {

public static void main(String[] args) {
    
    SpringApplication.run(WhizhopApplication.class, args);
 }
}
这是我的服务:

@Service
public class OrderService {
  @Autowired
   BillRepository billRepo;

    @Transactional(rollbackFor = Exception.class)
    public BaseDTO saveKot(BillDTO billDto) {
     try {
        //business logic
        billRepo.save();
     } catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        
    }
   }
}

如果发生任何异常,则不会回滚事务。

将业务逻辑提取到由
@Transactional(rollboor=exception.class)
注释的单独方法中,并从
saveKot
中删除注释

public BaseDTO saveKot(BillDTO billDto) {
    try {
        businessLogic(billDto);
    } catch (Exception e) {
        // catch if it needed but manually rollback is not needed
        return null;
    }
}

@Transactional(rollbackFor = Exception.class)
BaseDTO businessLogic(BillDTO billDto) throws Exception {
    // It will be automatically rolled back if Exception occurs
    ...
}

如果希望使用
@Transactional
处理异常,则不应捕获该异常

还请注意:

  • @Transactional
    仅适用于公共方法

  • 默认情况下,仅在运行时执行选项时才发生从@Transactional回滚,如果要更改此行为,可以将
    rollback或
    参数添加到注释中


    @事务性(rollbackFor={MyException.class})

    您使用的是MySQL,请确保您使用的是InnoDB表,而不是MyISAM表。(后者不支持事务!)。为什么手动尝试回滚事务?因为我使用的是try-catch。将成功处理该异常。因此,我必须手动回滚您是否应该将异常抛出方法并在外部处理它?这将是一个更好的设计,并且你将摆脱方法中丑陋的代码。问题解决了。我的Mysql引擎是MyISAM,我改成了InnoDB,现在它可以正常工作了