SpringBoot事务详解

注意:

使用事务时,一点要先查看当前数据库是否支持事务

Mysql中InnoDB支持事务,MyISAM不支持事务

Mysql版本高于5.5默认就是InnoDB

或使用SHOW TABLE STATUS查看

事务特点

原子性(Atomicity):整个事务是一个整体,不可分割的最小工作单位。一个事务中的所有操作要么全部执行成功,要么全部都不执行。其中任何一条语句执行失败,都会导致事务回滚

一致性(Consistency):数据库的记录总是从一个一致性状态转变成另一个一致性状态。这里的一致性是语义上的一致性, 并不是语法上的一致性

隔离性(Isolation):一个事物的执行,不受其他事务的干扰,即并发执行的事物之间互不干扰

持久性(Durability):数据一旦提交,结果就是永久性的。并不应为宕机等情况丢失。一般理解就是写入硬盘保存成功

@Transactional常用配置

@Transactional传播行为

@Transactional隔离级别

@Transactional回滚

自动回滚

手动回滚

设置回滚点

使用方式

一般使用在service中的的方法或类上

@Transactional 只能放在 public 修饰的方法上。默认情况下,该注解只对 RuntimeException 及其子类异常执行事务回滚。

注意事项

1. @EnableTransactionManagement

问题:springboot 项目中是否需要在 启动类上添加 @EnableTransactionManagement 注解?
答案:不需要。因为 springboot 自动装配已经帮助我们处理了,springboot 项目默认支持了事务。

2. @Transactional 失效

问题:方法上添加了 @Transactional 注解,为什么没有进行回滚?
排查一:是否使用了 try catch 进行了异常捕获,并且捕获之后,没有通过 throw new RuntimeException(); 进行异常抛出。因为对于 spring aop 异常捕获原理,被拦截的方法需要显示的抛出异常,并不能进行任何处理,这样 aop 代理才能捕获到方法的异常,才能进行事务的回滚操作;默认清空下,aop 只捕获 RuntimeException 的异常,但是可以通过配置来捕获特定的异常并回滚。
排查二:是否使用了 try catch 进行了异常信息捕获,如果是可以在 catch 语句中添加:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
排查三:排查是不是产生了自调用的问题。在 spring 的 aop 代理下,只有目标方法被外部调用,目标方法才由 spring 生成的代理对象来管理;若统一类中的其他没有用 @Transactional 注解进行修饰的方法内部调用了 用 @Transactional 注解进行修饰的方法,有 @Transactional 注解的方法的事务将会被忽略,不发生回滚。

备注:如果确实需要这样操作,只需要把 @Transactional 注解加在当前的类名上就可以了 或者使用 AspectJ 取代 spring aop 进行代理。
排查四:@Transactional 注解只被应用到 public 修饰的方法上;如果在 protected、private等修饰的方法上,@Transactional 注解不会报错,但是这个注解的将不会生效。
排查五:@Transactional 注解不会对当前修饰的方法的子方法生效。比如:我们在方法 A 中声明了 @Transactional 注解,但是 A 方法的内部调用的 方法 B 和 方法 C,其中方法 B 进行了 数据库的操作,但是改部分的异常被方法 B 进行了处理并且没有进行 抛出,这样的话事务是不会生效的。反之,如果 方法 B 声明了 @Transactional,但是方法 A 没有声明 @Transactional,A 方法内部调用 B 方法,事务也是不会生效的。如果想要事务生效,需要将子方法的事务控制交给调用的方法,在子方法中使用 @Transactional注解并通过 rollbackFor 指定定回滚的异常 或者直接将 异常 抛出。

备注:在使用事务的时候,最好把子方法的异常进行抛出,交给调用的方法进行处理。

相关推荐

  1. [笔记]事务简介-springboot

    2024-04-02 17:36:04       35 阅读
  2. SpringBoot事务传播机制

    2024-04-02 17:36:04       31 阅读
  3. SpringBoot事务

    2024-04-02 17:36:04       26 阅读
  4. Springboot事务管理

    2024-04-02 17:36:04       19 阅读
  5. MySQL-长事务详解

    2024-04-02 17:36:04       32 阅读
  6. 分布式事务 详解

    2024-04-02 17:36:04       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-02 17:36:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-02 17:36:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-02 17:36:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-02 17:36:04       20 阅读

热门阅读

  1. 深入了解Flutter中的Sealed Class及其使用

    2024-04-02 17:36:04       13 阅读
  2. linux脚本打包

    2024-04-02 17:36:04       12 阅读
  3. python系列教程220——哪种迭代最快

    2024-04-02 17:36:04       14 阅读
  4. 问答系统开发:基于深度学习的文本理解与生成

    2024-04-02 17:36:04       12 阅读
  5. 【leetcode面试经典150题】2.移除元素(C++)

    2024-04-02 17:36:04       9 阅读
  6. R语言提取站点的nc文件时间序列数据

    2024-04-02 17:36:04       13 阅读
  7. 每日一题 --- 用栈实现队列[力扣][Go]

    2024-04-02 17:36:04       13 阅读
  8. docker-打包&部署

    2024-04-02 17:36:04       9 阅读
  9. Python 踩坑记

    2024-04-02 17:36:04       16 阅读
  10. 设计模式-单例模式(饿汉式)

    2024-04-02 17:36:04       13 阅读