mysql进阶:设置了事务注解 @Transactional但未生效|手动事务回滚
创始人
2024-05-29 22:03:00
0

0. 引言

有同学遇到设置了事务,但是也报出了错误,但是一致未生效的问题,事务没有回滚,rollbackFor也设置成了捕捉全部报错Exception,那么这是怎么回事呢,其实原因很简单

1. 问题分析

首先我们要知道,事务的回滚是通过捕捉到错误了才执行的,如果本身没有报错是肯定不会进行回滚的。但还有一种情况,是大家比较容易忽略的,比如如下的一段代码,你觉得保存数据的操作会回滚吗?

    @Transactional(rollbackFor = Exception.class)public R save2(UserVO userVO) {User user = new User();// 拷贝属性BeanUtils.copyProperties(userVO, user);try {// 保存数据库saveUser(user);// 除数为0,将会报错int i = 1 / 0;} catch (Exception e) {e.printStackTrace();return R.fail("操作失败");}return R.success("操作成功");}

答案是不会,为什么呢?因为你并没有将错误抛出,而是选择了catch,也就是自己处理报错,因此@Transactional自然捕捉不到报错,也就不会进行回滚了

我们可以更简单的将try,catch去除掉,让@Transactional捕捉到错误,定义一个全局的错误拦截器处理报错返回即可。

@Transactional(rollbackFor = Exception.class)public R save2(UserVO userVO) {User user = new User();// 拷贝属性BeanUtils.copyProperties(userVO, user);// 保存数据库saveUser(user);// 除数为0,将会报错int i = 1 / 0;return R.success("操作成功");}

当然,如果你实在需要手动的try,catch,可能你还需要在catch里实现一些自定义的操作, 那么这时候怎么办呢?

@Transactional也提供了手动进行事务回滚的方法:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

于是我们的代码就可以调整为

    @Transactional(rollbackFor = Exception.class)public R save2(UserVO userVO) {User user = new User();// 拷贝属性BeanUtils.copyProperties(userVO, user);try {// 保存数据库saveUser(user);// 除数为0,将会报错int i = 1 / 0;} catch (Exception e) {TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();e.printStackTrace();return R.fail("操作失败");}return R.success("操作成功");}

2. 其他事务未生效的场景

  • final、static 修饰的方法或者类不支持@Transactional
  • 非public 修饰的方法不支持@Transactional
  • 当前类不是bean,或者没有被spring容器管理
  • 数据库不支持事务
  • 事务的传播机制导致

相关内容

热门资讯

唐代文学常识 唐代文学常识  唐朝文学是指唐朝(618年—907年)的文学。唐朝文学空前繁荣,“诗歌”最为光彩夺目...
赔了夫人又折兵歇后语   歇后语是中国劳动人民自古以来在生活实践中创造的一种特殊语言形式,是一种短小、风趣、形象的语句。它...
经典对联 经典对联集锦  在日常学习、工作或生活中,许多人都接触过一些比较经典的'对联吧,对联是一种对偶文学,...
钢铁是怎样炼成的作者简介 钢铁是怎样炼成的作者简介  《钢铁是怎样炼成的》是出自前苏联的一部自传性小说,是共产主义国家最著名的...
高考议论文写作之比喻论证 高考议论文写作之比喻论证  相信大家都不可避免地要接触到作文吧,特别是作文中不可忽视的议论文,议论文...
春联贴门上的贴法 春联贴门上的贴法  对联是汉族传统文化之一,又称楹联或对子,是写在纸、布上或刻在竹子、木头、柱子上的...
戏曲的谚语 关于戏曲的谚语关于戏曲的谚语1  1、一遍功夫一遍巧,一遍拆洗一遍新。  2、练到老,唱到老,学到八...
父母的雅称 父母的雅称  父母是我们最重要的人,关于父母的雅称你知道多少呢?以下是小编带来的父母的雅称,希望对你...
手机不可以掉到马桶里歇后语   导语:歇后语是一种很简短的特殊语言形式,简单易懂。下面小编整理一些歇后语,请大家认真阅读!  手...
人物对话描写200字作文 人物对话描写200字作文(精选23篇)  人与人之间,离不开语言形式的沟通。同样,在文章里,对话也是...
记叙文阅读人称教学设计 记叙文阅读人称教学设计  作为一位杰出的教职工,时常需要编写教学设计,教学设计是一个系统化规划教学系...
日常生活的谚语 关于日常生活的谚语  1、 饿了糠也甜,饱了肉也嫌。  2、 水深流势慢,智人话语迟。  3、 耳聋...
石榴花像什么比喻句摘抄 石榴花像什么比喻句摘抄  石榴的外表像一个球状的小口花瓶,它的皮是黄褐色的,剥开皮一看,一粒粒晶莹透...
家里厨房贴的厨房对联 家里厨房贴的厨房对联  上联:酒肴味淡惭无理  下联:主客情浓幸有缘  上联:厨无美酒殊惭主  下联...
立春的经典谚语 立春的经典谚语大全  在日常生活或是工作学习中,说到谚语,大家肯定都不陌生吧,谚语的内容会涉及到社会...
沟通的作文 关于沟通的作文大全  篇一:沟通  为什么我们要互相沟通?因为沟通增进人与人之间的友谊,是化解矛盾的...
公平是什么排比句 公平是什么排比句  在我们平凡的日常里,大家一定没少看到经典的句子吧,根据结构的不同句子可以分为单句...
作文 苦命的雪球 作文 苦命的雪球苦命的“雪球”             辽宁庄河市第二实验小学六年二班 寇乃文   ...
褒义词与贬义词有哪些 褒义词与贬义词有哪些  漫长的学习生涯中,大家都没少背知识点吧?知识点就是“让别人看完能理解”或者“...
中秋节猜的灯谜答案 中秋节猜的灯谜答案(精选100句)  中秋节是我国最重要的传统节日之一,为每年农历八月十五。灯谜你知...