本文共 2553 字,大约阅读时间需要 8 分钟。
上篇我们对 Transactional 注解进行了详细的解释,还没看的小伙伴,快看过来,本节我们将对事务的使用与回滚进行演示!
@Transactional public void save(){ Demo demo = Demo.builder().id(uid()) .name("javayh") .adder("beijing").build(); demoDao.save(demo);}
我们启动项目,进行接口调用,进行一个简单的插入,小编为了方便这次使用的是JPA,下面我们看一执行的过程;
从下图我们可以看出,@Transactional public void save(){ Demo demo = Demo.builder().id(uid()).name("javayh").adder("beijing").build(); demoDao.save(demo); Integer.valueOf(demo.getAdder()); }
当我们在访问接口时,发现接口已经报错,并在日志上,看出,事务进行了回滚,这说明事务生效了,但是这样是不是不是很友好?一堆的错误,客户看到也不明白!
@Transactional public Boolean save(){ Boolean flag =true; try{ Demo demo = Demo.builder().id(uid()).name("javayh").adder("beijing").build(); demoDao.save(demo); Integer.valueOf(demo.getAdder()); }catch (RuntimeException e){ e.printStackTrace(); flag = false; } return flag; }
但是惊奇的发现,我们的事务呢?怎么没有生效?这肯定是不对的我们改如何做?
@Transactional public Boolean save(){ Boolean flag =true; try{ Demo demo = Demo.builder().id(uid()).name("javayh").adder("beijing").build(); demoDao.save(demo); Integer.valueOf(demo.getAdder()); }catch (RuntimeException e){ e.printStackTrace(); flag = false; throw new RuntimeException(); } return flag; }
通过下图我们发现,事务rollback ,这才是我们想要的结果,业务失败,应该对事物进行回滚!
@Transactional public Boolean save(){ Boolean flag =true; try{ Demo demo = Demo.builder().id(uid()).name("javayh").adder("beijing").build(); demoDao.save(demo); Integer.valueOf(demo.getAdder()); }catch (RuntimeException e){ e.printStackTrace(); flag = false; TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();// throw new RuntimeException(); } return flag; }
今天的分享就到这里,希望对大家有所帮助
联系小编。微信:372787553,带您进群互相学习
左侧小编微信,右侧获取免费资料技术博客:
免费书籍:
SpringCloud学习代码:
Redis、Mongo、Rabbitmq、Kafka学习代码:
AlibabaCloud学习代码:
SpringBoot+SpringSecurity实现自定义登录学习代码:
转载地址:http://undpz.baihongyu.com/