Java Web —— 第九天(事务)

news2024/11/16 17:58:56

事务管理 & AOP

事务回顾

概念

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

操作

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

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

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

@Transactional

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

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

案例

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

//删除
    @Transactional //spring事务管理
    @Override
    public 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事务管理
    @Override
    public void DeleteDept(Integer id) {
        deptMapper.DeleteDept(id); //根据id删除部门数据
        //int i = 3/0; 异常,删除的部门数据会通过事务回滚恢复
        empMapper.deleteByDeptId(id); //根据被删除的部门id 删除该部门下的员工
    }

propagation

事务属性-传播行为

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

案例

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

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

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


    //删除
    @Transactional(rollbackFor = Exception.class) //spring事务管理
    @Override
    public 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 {

    @Autowired
    private DeptLogMapper deptLogMapper;

    @Transactional(propagation = Propagation.REQUIRES_NEW)//调用insert方法时,会开启一个新的事务
    @Override
    public 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 的日志记录也不会受到影响,这样可以确保日志记录的完整性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2085913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器访问端口命令

服务器访问端口命令是一组用于管理服务器端口的命令行指令。服务器端口是用于与外部设备或应用程序进行通信的逻辑通道,它允许数据在服务器和其他设备之间传输。以下是一些常见的服务器访问端口命令。 netstat:这个命令用于检查服务器上当前的网络连接和…

FPGA第 5 篇,FPGA技术优略势,FPGA学习方向,FPGA学习路线(FPGA专业知识的学习方向,FPGA现场可编程门阵列学习路线和方向)

前言 前几篇讲了一下FPGA的发展和应用,以及未来前景。具体详细,请看 FPGA发展和应用,以及未来前景https://blog.csdn.net/weixin_65793170/category_12665249.html 这里我们来,记录一下,FPGA专业知识的学习路线 一.…

OpenAI remove key access while using AAD authentication

题意:“OpenAI 在使用 AAD 认证时移除了密钥访问权限” 问题背景: I am calling Azure OpenAI API in my python code. To set it up, we need to provide a few parameters, one of which is openai.api_key. There are 2 options to get this value -…

力扣hot100-动态规划

文章目录 概念动态规划基本思想常见步骤常用技巧常见问题类型 动态规划题目题目: 爬楼梯题解 概念 动态规划 动态规划(Dynamic Programming,简称DP)是一种解决问题的算法思想,通常用于优化问题。它的核心思想是将一个…

K8S声明式的管理方式

一、K8S声明式的管理方式: 1、适合对资源的修改操作 2、声明式管理依赖于yaml文件,所有的内容都在yaml文件中声明 3、编辑好的yml文件还是要靠陈述式命令发布到K8S集群中 二、K8S中支持三种声明式的资源管理方式: 1、deployment格式&…

如何用Java SpringBoot Vue搭建创新创业学分管理系统?实战教程

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

GLM大模型 - CogVideoX:5B 开源,2B 转为 Apache 协议

8月6日,我们发布并开源了CogVideoX-2B模型,受到广大开发者的欢迎。 为了促进社区的自主使用和开放式创新,我们现决定将参数规模更大、性能更强的产品级模型 CogVideoX-5B 开源,同时 CogVideoX-2B 的开源协议调整为更加开放的Apac…

阿里云链接远程桌面Ubuntu22.4,出现的各种问题汇总,太艰辛,所以发出来,帮助一下后边的小伙伴

问题一:远程登录桌面计算机名写什么:写ip,公网ip,用户名不要填 问题二 Win10远程连接Ubuntu20.04桌面黑屏的问题 如果你是用浏览器连接上了云服务器,那么请先logout!

算法的学习笔记—从 1 到 n 整数中 1 出现的次数(牛客JZ43)

😀前言 在编程面试中,求解从 1 到 n 的整数中数字 1 出现的次数是一个常见的挑战。该问题的关键在于如何高效地统计数字 1 出现的次数。本文将详细分析该问题的解题思路,并提供一个高效的 Java 实现。 🏠个人主页:尘觉…

java 切面日志打印出参入参

切面Controller出入参日志打印 项目结构 切面日志对controller下所有的方法生效 切面代码 Slf4j Aspect Component public class ControllerLogAspect {// 定义一个切点,拦截所有Controller层的public方法Before("execution(public * com.jzt.market.cont…

Android解析异步消息处理机制

文章目录 Android解析异步消息处理机制MessageHandlerMessageQueueLooper Android解析异步消息处理机制 Android中的异步消息处理主要由4个部分组成:Message、Handler、MessageQueue和Looper。其中Message和Handler在上一小节中我们已经接触过了,而Mess…

大数据基础:离线与实时数仓区别和建设思路

文章目录 离线与实时数仓区别和建设思路 一、离线数仓与实时数仓区别 ​​​​​​​二、实时数仓建设思路 离线与实时数仓区别和建设思路 ​​​​​​​一、离线数仓与实时数仓区别 离线数据与实时数仓区别如下: 对比方面 离线数仓 实时数仓 架构选择 传…

ComsolMatlab 两级串联扩张式消声器仿真解与解析解

消声器的声学性能通常要求消声器在工作频率范围内有较大的消声量以及较宽的消声频带。常用的消声器声学性能评价指标通常有传递损失、插入损失、减噪量三种。其中插入损失只能反映整个系统在安装消声器前后声学特性的变化,并不能直接反映消声器本身单独具有的属性。…

计算机毕业设计选题推荐-中药材进存销管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

假期学习--对象底层结构和继承链

OC本质底层实现转化其实都是C/C代码。 OC对象的本质就是结构体。 NSObject底层是struct objc_object结构体 ;struct objc_class : objc_object { …省略无关代码 // Class ISA; //ISA(从objc_object继承过来的) Class superclass; //指向其父类 cache_t cache…

王伊朵闪耀“快乐阳光”舞台 再夺全国冠军

在近日落幕的“赛克杯”第20届快乐阳光少年儿童歌曲卡拉OK电视大赛全国总决赛中,就读于北京市建华实验学校,年仅11岁的小选手王伊朵以其出色的唱功和卓越的舞台表现,一举夺得全国冠军,成为本次大赛一颗耀眼的小明星。 王伊朵自小对…

基于NNG的六种通信模式

NNG是一个消息传递框架,用来解决常见的消息传递问题。NNG是nanomsg的继任版本,纯c语言开发,工作模式分为一下几种: Pipeline单向管道 此模式可用于解决生产者/消费者问题,包括负载均衡。 消息从推侧流向拉侧。 如果多…

‌U盘闪一下就没了?‌如何有效恢复数据

在日常使用U盘的过程中,‌我们可能会遇到一种突发情况:‌U盘插入电脑后仅仅闪了一下就消失了,‌无法再被识别或访问。‌这种情况下,‌U盘中的数据似乎瞬间变得遥不可及。‌然而,‌不必过于担心,‌因为仍然有…

Kafka消息积压的典型场景及解决方案

Kafka消息积压的典型场景: 1.实时/消费任务挂掉 比如,我们写的实时应用因为某种原因挂掉了,并且这个任务没有被监控程序监控发现通知相关负责人,负责人又没有写自动拉起任务的脚本进行重启。 那么在我们重新启动这个实时应用进行…

【Docker】构建Harbor仓库

下载软件包地址:https://github.com/goharbor/harbor/releases Harbor 是由vmware公司开源的企业级 Docker Registry 项目。 它提供了以下主要功能和特点: 1. 基于角色的访问控制(RBAC):可以为不同的用户和用户组分…