SpringBoot中应用@Transactional注解对事务控制的管理(不要滥用)

我们在开发过程中事务是无法回避的一个问题,什么是事务呢?简单来讲就是 “要么都成功,要么都失败”;典型案例就是我们在做支付的时候,如果没有失误控制,那么就有可能发生故障,比如说我在支付的过程中,突然出现了断网,我这边的钱扣出去了,但是对方却没有收到钱,这是极其严重的。抛开支付,我们在开发的过程中,涉及到两张及以上表的修改操作时,也是需要考虑事务的。那么我们怎么去控制呢?

  • 使用 @Transactional 注解去解决
  1. @Transactional 是声明式事务管理 编程中使用的注解
  2. @Transactional 是放在接口实现类或接口实现方法上,而不是接口类中。
  3. @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。
  4. 我们在一开始进行系统设计的时候,考虑将@Transactional放到需要进行事务管理的方法上,而不是放在所有接口实现类上,因为只读的接口就不需要事务管理,由于配置了@Transactional就需要AOP拦截及事务的处理,可能影响系统性能。但是如果方法中有很多都需要增删改操作,那么最简单粗暴的方法就是将注解放到实现类上。
  5. @Transactional 实质是使用了 JDBC 的事务来进行事务控制的
    @Transactional 基于 Spring 的动态代理的机制
  6. Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时他才会生效,当作用于类上市,该类下所有的public方法将都具有该类型的事务属性,同时我们也可以在方法级别上使用该标注来覆盖类级别的定义
  • 应用实例
    • 我们先在类上加上注解
      在这里插入图片描述
    • 方法实例
      在这里插入图片描述
      我们看到学生和班级在一个方法中都有修改操作,但是在学生信息修改完后,下面我添加了一条异常语句,自然班级修改是不会被执行的,那么我们来看看修改的学生信息是否会回滚?
    • 修改前
      在这里插入图片描述
      在这里插入图片描述
    • 修改后的结果还是跟上图一样,没有发生变化,这说明我们的事务控制是生效的,同时说明要么都成功要么都失败。
    • 我们倘若不加这个注解,方法执行后会是怎么的结果呢?
      在这里插入图片描述
      我去掉了这个注解,我们看看结果会怎样
      在这里插入图片描述
      在这里插入图片描述
      我们可以看到,学生信息被修改成功,但是班级信息却没有修改成功,所以这是很危险的,在正常生产环境下,这是极其严重的事故。

参考博文:https://blog.csdn.net/jiangyu1013/article/details/84397366

猜你喜欢

转载自blog.csdn.net/qq_44922113/article/details/113378339