浅谈spring事务

3 篇文章 0 订阅

spring 事务的三种实现方式

①声明式:使用SpringAop配置事务,这种方式大大的简化了编码。需要注意的是切入点表达式一定要写正确,切入点错误,无法准确拦截方法,会导致事务无法回滚。

②注解式:在方法或类上直接使用@Transactional注解,非常简洁方便。

③编程式:在代码中手工开启事务,手工提交,出现异常,手工回滚。优点是异常都会回滚捕获,不会出现无法回滚的情况,缺点是太麻烦。

个人比较喜欢使用注解式的事务管理,但是自己写了代码之后发现就算同一个事务下的方法,有一个方法更新失败(多个方法都是更新方法)之后,数据库没有进行回滚操作,后来陆陆续续饰演了几次,并且查了一些资料才了解到,其实spring事务管理并不是更新失败就进行事务回滚,而是检测到异常之后才进行事务回滚,而spring事务默认拦截的是RuntimeException,如果是需要拦截更多的方法,则需要自定义@Transactional,在后面加上(rollbackFor = Exception.class)
或者(rollbackFor = Throwable.class),但是这里面又有区别了,Exception仅仅是异常,而Throwable是Exception的父类,包括exception的同时还包括Error。

选择Throwable还是Exception呢?

个人建议是选择Throwable,因为Throwable不仅仅包括Exception,还包括Error,Exception仅仅指我们遇到的异常,是指程序可以处理的问题,而Error是指jvm遇到的错误,如果我们在执行数据库更新插入操作的时候,我们最后的更新遇到error,我们又没有进行事务回滚的时候,那么就可能会存在一些问题。所以我的选择依然是Throwable

什么时候进行回滚,如何回滚?

对于一个初级开发来说,什么时候回滚,如何回滚也是一个非常考究的问题,因为我们如果使用不当,很容易就会产生脏数据,到时候不免又的让其他工程师帮你洗数据,非常麻烦,而且非常让人心态爆炸!

什么时候回滚?为什么要回滚?
什么时候回滚: 当我们进行多表更新插入操作的时候,我们可能就需要进行回滚,如以下情况:
假如我们用户有自己的钱包,当我们消费了之后,需要先减钱包的余额,然后生成钱包流水,(现实可能有差异,这里只是举例)
当我们进行了减余额操作时候,我们需要插入一条记录,但是正好我们这条记录生成失败了,那这个时候就应该回滚了。如果不回滚,那么
我们是不是在钱包里面就看不到交易记录,就可能认为我们的钱消失了?(现实可能有重试等情况,但是核心就说这样)

那我们是不是失败了就抛异常呀?

并不是!
要是我们仅仅是修改一个头像,修改失败了,我们完全可以提示用户修改失败,请稍后再重试!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值