Java Web —— 第九天(事务)

2024-08-30 02:20
文章标签 java web 事务 第九天

本文主要是介绍Java Web —— 第九天(事务),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事务管理 & AOP

事务回顾

概念

事务 是一组操作的集合,它是一个不可分割的工作单位,这些操作 要么同时成功,要么同时失败

操作

开启事务(一组操作开始前,开启事务): start transaction / begin

提交事务(这组操作全部成功后,提交事务):commit 

回滚事务(中间任何一个操作出现异常,回滚事务): rollback 

@Transactional

@Transactional 是 Spring 框架中用于声明事务的注解,它可以应用在方法或类上,定义该方法或类中的所有方法在执行时应该运行在一个事务中。通过使用 @Transactional,可以确保数据库操作的一致性和数据的完整性,即使在出现异常时也可以回滚操作。

@Transactional基本用法
  • 方法级别: 当 @Transactional 注解应用在方法上时,该方法的所有数据库操作都会在一个事务中执行。
  • 类级别: 当 @Transactional 注解应用在类上时,该类的所有公共方法都会在一个事务中执行。

案例

解散部门:删除部门,同时删除该部门下的员工

//删除@Transactional //spring事务管理@Overridepublic void DeleteDept(Integer id) {deptMapper.DeleteDept(id); //根据id删除部门数据//int i = 3/0; 异常,删除的部门数据会通过事务回滚恢复empMapper.deleteByDeptId(id); //根据被删除的部门id 删除该部门下的员工}
    //根据部门id删除部门下的员工数据@Delete("delete from emp where dept_id = #{deptId}")void deleteByDeptId(Integer deptId);
Spring事务管理

注解:@Transactional

位置:业务(service)层的方法上、类上、接口上

作用:将当前方法交给spring进行事务管理,方法执行前,开启事务,成功执行完毕,提交事务,

出现异常,回滚事务

事务进阶

rollbackFor

事务属性-回滚

默认情况下,只有出现 RuntimeException才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务

     //删除@Transactional(rollbackFor = Exception.class) //spring事务管理@Overridepublic void DeleteDept(Integer id) {deptMapper.DeleteDept(id); //根据id删除部门数据//int i = 3/0; 异常,删除的部门数据会通过事务回滚恢复empMapper.deleteByDeptId(id); //根据被删除的部门id 删除该部门下的员工}

propagation

事务属性-传播行为

事务传播行为:指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制

案例

解散部门时,记录操作日志

需求:解散部门时,无论是成功还是失败,都要记录操作日志步骤:

1.解散部门:删除部门、删除部门下的员工

//删除@Transactional(rollbackFor = Exception.class) //spring事务管理@Overridepublic void DeleteDept(Integer id) {try {deptMapper.DeleteDept(id); //根据id删除部门数据
//            int i = 3/0; //异常,删除的部门数据会通过事务回滚恢复empMapper.deleteByDeptId(id); //根据被删除的部门id 删除该部门下的员工} finally { //无论上面代码成功或失败都会执行DeptLog deptLog = new DeptLog();deptLog.setCreateTime(LocalDateTime.now());deptLog.setDescription("执行了解散部门的操作,解散的部门id是:"+id);deptLogService.insert(deptLog);}}

2.记录日志到数据库表中 

@Service
public class DeptLogServiceImpl implements DeptLogService {@Autowiredprivate DeptLogMapper deptLogMapper;@Transactional(propagation = Propagation.REQUIRES_NEW)//调用insert方法时,会开启一个新的事务@Overridepublic void insert(DeptLog deptLog) {deptLogMapper.insert(deptLog);}

 场景

REQUIRED:大部分情况下都是用该传播行为即可。

REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功

AI扩展

在Spring事务管理中,REQUIREDREQUIRES_NEW 是两种常见的事务传播行为,它们主要用于控制在方法调用过程中事务的传播方式。

1. REQUIRED 传播行为

  • 概念: REQUIRED 是默认的传播行为,它表示当前方法需要在一个已有的事务中执行。如果调用方已经在一个事务中,当前方法将加入到这个事务中;如果没有,Spring 会创建一个新的事务。
  • 适用场景: REQUIRED 适用于大多数情况下,因为它能确保整个业务逻辑在同一个事务中运行,这样如果在事务中的某个方法抛出了异常,整个事务会回滚,保证数据的一致性。
@Transactional(propagation = Propagation.REQUIRED)
public void updateAccount() {// 如果调用者已经有事务,加入现有事务;否则创建新事务
}

2. REQUIRES_NEW 传播行为

  • 概念: REQUIRES_NEW 表示当前方法总是需要一个新的事务。无论调用方是否有事务,Spring 都会为这个方法创建一个新的事务,并且暂停调用方的事务,直到新事务完成。如果新事务回滚,不会影响调用方的事务。
  • 适用场景: REQUIRES_NEW 常用于需要隔离的操作。例如,在一个大事务中,需要确保某个操作(如日志记录或事件追踪)独立于主要事务,即使主要事务回滚,也要保证这些操作能够成功完成。
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveLog() {// 始终启动一个新事务,暂停外部事务
}

扩展理解

在一个复杂的业务逻辑中,多个服务或方法之间的调用可能会有不同的事务处理需求。使用 REQUIRES_NEW 时,新的事务独立于外部事务,因此即使外部事务失败回滚,REQUIRES_NEW 包含的操作仍然会成功提交。

举例

假设在一个订单系统中,用户下订单时需要先记录操作日志。此时,saveLog 方法使用 REQUIRES_NEW,即使订单提交失败,日志也会被成功保存。这对于追踪失败原因、审计记录等场景非常有用。

@Transactional(propagation = Propagation.REQUIRED)
public void placeOrder(Order order) {// 记录订单日志,独立事务saveLog(order);// 下订单,主事务saveOrder(order);
}@Transactional(propagation = Propagation.REQUIRES_NEW)
public void saveLog(Order order) {// 记录日志,确保独立于主事务,即使主事务回滚,日志也会被保存
}

在上述代码中,即使 saveOrder 发生异常并导致订单提交失败,saveLog 的日志记录也不会受到影响,这样可以确保日志记录的完整性。

这篇关于Java Web —— 第九天(事务)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119529

相关文章

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

springboot security之前后端分离配置方式

《springbootsecurity之前后端分离配置方式》:本文主要介绍springbootsecurity之前后端分离配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的... 目录前言自定义配置认证失败自定义处理登录相关接口匿名访问前置文章总结前言spring boot secu

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3