Java @如果引发异常,则事务性不起作用
这是我的spring boot应用程序: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); } } 这是我的服务:
@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,现在它可以正常工作了