01 事务

事务是一组原子操作单元,要么全部执行成功,要么撤销不执行

一、事务概念

1.1 数据库中的事物

数据库事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。

事务的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。 

事务的一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。 

事务的隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。 

事务的持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确。

1.2 JAVA中的事物

一个Java应用系统,如果要操作数据库,则通过JDBC来实现的。增加、修改、删除都是通过相应方法间接来实现的,事务的控制也相应转移到Java程序代码中。 因此,数据库操作的事务 习惯上就称为Java事务。

Spring事务管理分为编程式和声明式:

  • 编程式:通过编码实现事务。
  • 声明式:基于AOP,将具体业务逻辑与事务处理解耦,使业务代码不受污染。声明式有两种方式:一种是在配置文件xml中做相关的事务规则声明。另一种是基于@Transactional注解。

二、JAVA中事务使用

2.1 注解@Transactional(✅)

在SpringBoot中,在业务层添加事务注解(@Transactional )即可快速开启事务,但是最小粒度只能用到方法上。

注意⚠️:MDP项目中,还需要在启动类上添加增加@EnableTransactionManagement注解

使用注解:只能用在接口定义接口方法类定义类的public方法上,不能对代码块进行事务控制。

2.1.1 事务失效的情况

1、异常类型不正确

默认情况下,RuntimeExceptionError的情况下,spring事务才会回滚,否则事务不会回滚。

 也可以自定义回滚的异常类型:@Transactional(rollbackFor = {异常类型列表})

2、异常被捕获
当业务方法抛出异常,spring感知到异常的时候,才会做事务回滚的操作,若方法内部将异常给吃了,那么事务无法感知到异常了,事务就不会回滚了。(不要捕获异常)
3、非public方法
4、注解属性 propagation 设置错误

5、外部调用方法没有事务

同一类中的两个方法A和B,方法A没有声明注解事务,而B方法有,A调用本类的方法B(不论方法B是用public还是private修饰),方法B的事务是不会起作用的 原因

解决:调用方法A上也添加注解。

注:不同类中调用不用加注解,是可以生效的。

参考资料

@Transactional注解配置事务管理(注解的使用)

一口气说出 6种,@Transactional注解的失效场景 (失效场景)

Java中事务总结详解

SpringBoot 快速开启事务(附常见坑点)

posted @   zhegeMaw  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示