导语
上篇我们对 Transactional 注解进行了详细的解释,还没看的小伙伴,快看过来https://blog.csdn.net/weixin_38937840/article/details/103939034,本节我们将对事务的使用与回滚进行演示!
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,带您进群互相学习
左侧小编微信,右侧获取免费资料
技术博客:https://blog.csdn.net/weixin_38937840
免费书籍:https://github.com/Dylan-haiji/Programmer-Learning-materials
SpringCloud学习代码: https://github.com/Dylan-haiji/javayh-cloud
Redis、Mongo、Rabbitmq、Kafka学习代码: https://github.com/Dylan-haiji/javayh-middleware
AlibabaCloud学习代码:https://github.com/Dylan-haiji/javayh-cloud-nacos
SpringBoot+SpringSecurity实现自定义登录学习代码:https://github.com/Dylan-haiji/javayh-distribution
来源:CSDN
作者:Java有货
链接:https://blog.csdn.net/weixin_38937840/article/details/103939783