如何解决@Transactional遇到try catch失效的问题
这篇文章给大家分享的是有关如何解决@Transactional遇到try catch失效的问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
@Transactional遇到try catch失效
Springboot中@Transactional遇到了try catch失效了,需要手动回滚
try { user.setExpire(Integer.parseInt(expire)); userService.updateById(user); Host host = hostService.getById(user.getHostId());//查询数据库的host信息 updateResponse = proxmoxConfig.updateEffectiveTime(user.getUserName(), expire, host.getHostUrlRequest()); } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); }
@Transactional与try..catch同时使用的经验
@transactional 是我们在java 开发中经常用到的注解,帮助我们非常方便快捷的完成事务管理,尤其在批量处理数据的时候,更是重要,最近业务中遇到了这种情况,
批量向数据库导入数据,这就会出现excel表中有的数据类型符合导入要求,有的不符合,当我们导入的时候要么就全部成功的导入,要么就失败都不导入,如果不用事务的话就会出现数据正确的会导入到数据库,不正确的就没导入,造成数据的不一致性,
可我的业务不仅仅是用@transactional 注解完成事务,而且当出现数据不符抛异常的时候还要返回错误的提示,所以我还得结核try...catch 块,问题来了,用try...catch就是捕获异常,然后处理掉,而 @transactional 是要在系统抛异常的时候才能起到事务回滚的作用,
后来我查了一些资料,如下操作:
重点就是TransactionAspectSupport.currentTransactionStatus().setRollbackOnly 这个方法,它会起到异常回滚的作用,这样我就可以在它执行完之后,设置需要返回的自定义的信息
最近又遇到了@transactional 注解不起作用的问题了,这一次的情况是原来我的mysql 数据库默认用的是MyISAM 引擎,而这个存储引擎不支持事务,所以需要对数据库的进行一下操作:在控制台输入 alter table xxx(表名) engine=InnoDB 然后你可以在输入show create table xxx(表名) 来查看是否修改成功
感谢各位的阅读!关于“如何解决@Transactional遇到try catch失效的问题”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341