博客
关于我
Spring Transactional 事务使用与回滚策略
阅读量:563 次
发布时间:2019-03-09

本文共 2553 字,大约阅读时间需要 8 分钟。

导语

上篇我们对 Transactional 注解进行了详细的解释,还没看的小伙伴,快看过来,本节我们将对事务的使用与回滚进行演示!

Transactional 事务使用与回滚策略

@Transactional public void save(){           Demo demo =         	Demo.builder().id(uid())        	.name("javayh")        	.adder("beijing").build();        demoDao.save(demo);}

我们启动项目,进行接口调用,进行一个简单的插入,小编为了方便这次使用的是JPA,下面我们看一执行的过程;

从下图我们可以看出,

  • 首先Spring为我创建了默认的事务,并进行了默认配置,还不了接的请看上篇的现象介绍
  • 之后进行了数据库的操作,这是我的代码执行完成,没有任何的异常
  • 最后进行了事务的提交和关闭
    在这里插入图片描述
    然后我对上面的代码进行修改
@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;    }

但是惊奇的发现,我们的事务呢?怎么没有生效?这肯定是不对的我们改如何做?

在这里插入图片描述
这样只是进行了友好的返回,Spring 并没拦截到异常信息,他认为,这次调用是成功的!那么办法就来了,我们把异常抛出去不就OK了?

@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;    }
  • TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 手动进行事务回滚
    执行后的效果和上边抛出异常是异常的,但是对客户端进行了良好的返回!

今天的分享就到这里,希望对大家有所帮助

关注 Java有货领取更多资料

联系小编。微信:372787553,带您进群互相学习

左侧小编微信,右侧获取免费资料
在这里插入图片描述

技术博客:

免费书籍:

SpringCloud学习代码:

Redis、Mongo、Rabbitmq、Kafka学习代码:

AlibabaCloud学习代码:

SpringBoot+SpringSecurity实现自定义登录学习代码:

转载地址:http://undpz.baihongyu.com/

你可能感兴趣的文章
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>