当前位置: 首页 > news >正文

ssm框架-spring-spring声明式事务

声明式事务概念

  声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。

  开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作!

  使用声明式事务可以将事务的控制和业务逻辑分离开来,提高代码的可读性和可维护性。

  区别:

  - 编程式事务需要手动编写代码来管理事务
  - 而声明式事务可以通过配置文件或注解来控制事务。

spring声明式事务实现原理

一、事务的定义

事务是数据库操作的最小工作单元,作为单个逻辑工作单元执行的一系列操作。这些操作必须作为一个整体来执行,即要么全部成功,要么全部失败。事务的这一特性保证了数据的一致性和可靠性,特别是在多用户共享资源的环境下。

在没有spring框架的情况下,需要我们进行编程式事务,即自己手动控制事务的回滚和提交

但是操作繁杂,所以我们使用了spring框架的声明式事务自动控制事务的各种流程,那么如何添加声明式事务呢?

二.添加声明式事务

对于需要添加事务的方法,添加一个这样的注解,就可以添加声明式事务了

不过要注意,我们在配置类中,需要添加一个如下图红箭头所示的注解,去开启事务注解的支持

并且我们需要在ioc容器中给对应的数据库连接池添加这样的管理器

事务属性:

只读模式

代码如下,当一个数据库操作只有查询的时候,可以设置事务为只读模式,这样会加快查询的效率

package org.atguigu.Service;import org.atguigu.dao.StudentDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional
public class StudentService {@Autowiredprivate StudentDao studentDao;@Transactional(readOnly = true)public void changeInfo(){studentDao.updateAgeById(100,1);int i=1/0;System.out.println("-----------");studentDao.updateNameById("test1",1);}
}

超时时间

我们假设有如下代码,我们设置超时时限为3,然后我们使得这个线程休眠4000,于是当我们执行后就会发生以下错误

@Transactional(readOnly = true,timeout = 3)public void changeInfo(){studentDao.updateAgeById(100,1);int i=1/0;try {Thread.sleep(4000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("-----------");studentDao.updateNameById("test1",1);}

那么我们思考一个问题,假设我们在类上施加一个超时时限的注解,其中的方法会如何呢

观察如下代码,我们在类上设置了一个timeout = 3类上有一个注解用于设置只读模式

那么执行结果会是什么样呢

package org.atguigu.Service;import org.atguigu.dao.StudentDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;@Service
@Transactional(timeout = 3)
public class StudentService {@Autowiredprivate StudentDao studentDao;@Transactional(readOnly = false)public void changeInfo(){studentDao.updateAgeById(100,1);
//        int i=1/0;try {Thread.sleep(4000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("-----------");studentDao.updateNameById("test1",1);}
}

执行结果如下,我们可以发现,没有任何报错,这是因为方法上的注解将类上的注解覆盖掉了

事务异常

正常情况下,假设你不做任何设置,其只会在运行时异常发生时才会发生事务回滚

那么假设我们想要规定一些默认情况下不会回滚的异常也要进行回滚,那么我们该如何做呢

首先我们观察一下异常类的各种关系,当默认情况下发生RentimeException(运行时异常)

就会回滚,而IOException就不会发生回滚

如图,我们设置了一个rollbackfor = Exception.class 这个注解的属性,这个属性规定了事务发生什么类型的错误应该回滚

而我们还设置了一个noRollbackFor = RuntimeException.class 这个注解属性,这个属性的意思是,在回滚范围内,什么异常类型不回滚

事务隔离

1. 事务隔离级别

    数据库事务的隔离级别是指在多个事务并发执行时,数据库系统为了保证数据一致性所遵循的规定。常见的隔离级别包括:

    1. 读未提交(Read Uncommitted):事务可以读取未被提交的数据,容易产生脏读、不可重复读和幻读等问题。实现简单但不太安全,一般不用。
    2. 读已提交(Read Committed):事务只能读取已经提交的数据,可以避免脏读问题,但可能引发不可重复读和幻读。
    3. 可重复读(Repeatable Read):在一个事务中,相同的查询将返回相同的结果集,不管其他事务对数据做了什么修改。可以避免脏读和不可重复读,但仍有幻读的问题。
    4. 串行化(Serializable):最高的隔离级别,完全禁止了并发,只允许一个事务执行完毕之后才能执行另一个事务。可以避免以上所有问题,但效率较低,不适用于高并发场景。

    不同的隔离级别适用于不同的场景,需要根据实际业务需求进行选择和调整。

  1. 脏读(Dirty Read):一个事务可以读取另一个事务尚未提交的数据。如果该数据后来被回滚,那么第一个事务读取到的数据就是“脏”的。脏读通常发生在读未提交隔离级别下。

  2. 不可重复读(Non-repeatable Read):在一个事务中,两次读取同一数据时,数据内容不同。这是因为在两次读取之间,另一个事务修改并提交了该数据。不可重复读通常发生在读已提交隔离级别下。

  3. 幻读(Phantom Read):一个事务在读取某范围的数据时,另一个事务在该范围内插入了新数据,导致前一个事务再次读取时,发现多了“幻影”行。幻读通常发生在可重复读隔离级别下。

在代码中,我们可以这样设置事务的隔离性

事务传播

事务传播的定义

指的是事务之间的调用,叫做事务传播,比如下列图片中的业务方法1调用业务方法2,这叫做事务的传播,我们一般将事务的传播属性设置到子事务上

事务的传播属性有

1.假如父事务

2.不加入父事务

注解方式规定事务传播

通过在@Transactional注解里面,添加一个propagation注解设置事务的传播行为,

那么设置事务的传播行为有什么用呢?举个例子,在topService()事务里面,调用别的事务,然后我们在changeName()里面故意放了一个报错,

那么当topService调用两个事务时,是加入式的,他们合并为一个事务

当其中某个事务出现了报错的时候,整个事务就会回滚,看作一个事务,其他的事务的行为也不会修改

当事务加入的方式是独立的时候,那么当某个事务报错的时候,就不会影响别的事务的操作

相关文章:

ssm框架-spring-spring声明式事务

声明式事务概念 声明式事务是指使用注解或 XML 配置的方式来控制事务的提交和回滚。 开发者只需要添加配置即可, 具体事务的实现由第三方框架实现,避免我们直接进行事务操作! 使用声明式事务可以将事务的控制和业务逻辑分离开来,提…...

React第五节 组件三大属性之 props 用法详解

特性 a、props最好是仅限于父子上下级之间的数据传递,如果是祖孙多级之间传递属性,可以考虑使用props是否合适,或者使用替代方案 useContext() 或者使用 redux状态管理; b、props 中的属性是只读属性,如果想修改其中的…...

测评部署和管理 WordPress 最方便的面板

新版宝塔面板快速搭建WordPress新手教程 - 倚栏听风-Morii - 博客园 初学者使用1Panel面板快速搭建WordPress网站 - 倚栏听风-Morii - 博客园 可以看到,无论是宝塔还是1Panel,部署和管理WordPress都有些繁琐,而且还需要额外去配置Nginx和M…...

【系统分析师】-2024年11月论文-论DevOps开发

1、题目要求 论Devops及其应用。Devops是一组过程、方法与系统的统称,用于促进开发、技术运营和质量保障部门之间的沟通,协作与整合。它是一种重视软体开发人员和工厂运维技术人员之间沟通合作的模式。透过自动化“软件交付”和“架构变更”的流程&…...

算法【子数组最大累加和问题与扩展】

子数组最大累加和问题是一个非常经典的问题,也比较简单。但是扩展出的问题很多,在笔试、面试中特别常见,扩展出的问题很多非常有趣,解法也比较巧妙。 下面通过一些题目来加深理解。 题目一 测试链接:https://leetcode…...

小程序23-页面的跳转:navigation 组件详解

小程序中,如果需要进行跳转,需要使用 navigation 组件,常用属性: 1.url :当前小程序内的跳转链接 2.open-type:跳转方式 navigate:保留当前页面,跳转应用内的某个页面&#xff0c…...

AI社媒引流工具:解锁智能化营销的新未来

在数字化浪潮的推动下,社交媒体成为品牌营销的主战场。然而,面对海量的用户数据和日益复杂的运营需求,传统营销方法显得力不从心。AI社媒引流王应运而生,帮助企业在多平台中精准触达目标用户,提升营销效率和效果。 1.…...

【Node.js】全面解析 Node.js 安全最佳实践:保护您的应用

Node.js 是一种强大的 JavaScript 运行时,广泛用于构建现代 Web 应用和 API。然而,由于其开放性和异步特性,Node.js 应用容易受到多种安全威胁的攻击,比如 SQL 注入、跨站脚本 (XSS) 和拒绝服务攻击 (DoS)。在本文中,我…...

Docker 用法详解

文章目录 一、Docker 快速入门1.1 部署 MYSQL1.2 命令解读: 二、Docker 基础2.1 常见命令:2.1.1 命令介绍:2.1.2 演示:2.1.3 命令别名: 2.2 数据卷:2.2.1 数据卷简介:2.2.2 数据卷命令&#xff…...

Python小游戏28——水果忍者

首先,你需要安装Pygame库。如果你还没有安装,可以使用以下命令进行安装: 【bash】 pip install pygame 《水果忍者》游戏代码: 【python】 import pygame import random import sys # 初始化Pygame pygame.init() # 设置屏幕尺寸 …...

Kafka Offset 自动提交和手动提交 - 漏消费与重复消费

目录 1. 引言 2. Offset 提交方式概述 2.1 自动提交 Offset 2.2 手动提交 Offset 3. 漏消费与重复消费的问题分析 3.1 自动提交模式下的漏消费和重复消费 漏消费 重复消费 3.2 手动提交模式下的漏消费和重复消费 漏消费 重复消费 4. 自动提交与手动提交的选择 4.1…...

Vue3父组件和子组件

子组件暴露方法给父组件&#xff0c;父组件传值 子组件 const editCalendar (value: string) > {console.log(获取父组件的值, value)};//暴露给外部调用defineExpose({editCalendar,}); 父组件 <template> <CalendarEdit ref"editRef" /> </…...

Linux 定时任务全解析

文章目录 一、Cron 服务1.1安装1.2配置文件格式1.3使用方法1.4系统级与用户级 Cron 任务区别 二、At 服务2.1安装2.2工作原理2.3使用方法 一、Cron 服务 1.1安装 在大多数 Linux 发行版中&#xff0c;Cron 服务通常已经默认安装。例如在 Ubuntu 系统中&#xff0c;可以通过以…...

XLNet——打破 BERT 局限的预训练语言模型

近年来&#xff0c;深度学习在自然语言处理&#xff08;NLP&#xff09;领域取得了革命性进展&#xff0c;其中 BERT 的出现标志着双向语言建模的强大能力。然而&#xff0c;BERT 也存在一些局限性&#xff0c;限制了其在生成任务中的表现。2019 年&#xff0c;由 Google 和 Ca…...

开源代码统计工具cloc的简单使用

一.背景 公司之前开发了个小系统&#xff0c;要去申请著作权&#xff0c;需要填写代码数量。应该怎么统计呢&#xff1f;搜索了一下&#xff0c;还是用开源工具cloc吧&#xff01;我的操作系统是windows&#xff0c;代码主要是java项目和vue项目。 二.到哪里找 可以去官方下载…...

如何创建一个项目用于研究element-plus的原理

需求&#xff1a;直接使用element-plus未封装成组件的源码&#xff0c;创建一个项目&#xff0c;可以使用任意的element-plus组件&#xff0c;可以深度研究组件的运行。例如研究某一个效果&#xff0c;如果直接在node_modules修改elment-plus打包之后的那些js、mjs代码&#xf…...

单片机进阶硬件部分_day2_项目实践

设计要求 从绘制原理图到画PCB板&#xff0c;完成智能云衣柜项目 STM32 &#xff08;Modbus&#xff09;云IOT衣物云端管理 华为PCB布线规范 基于IoT的智享家主控系统 步骤分析 需求分析 器件选型绘制原理图&#xff08;器件连接&#xff09;PCB布局、布线泪滴、铺铜、添加丝印…...

labview关于文件路径的问题

在调用文件或拆分文件的时候经常会用到拆分路径函数和创建路径函数&#xff0c;最常用的也是当前应用程序目录或者是当前VI目录。 这里我们看到应用程序目录和VI目录在同一项目中&#xff0c;应用程序目录更像是根目录&#xff0c;往下拆分成了各个VI的子目录。 接下来我们来拆…...

72项!湖北省2024年度第二批省级科技计划项目拟立项项目公示!

本期精选 SCI&EI ●IEEE 1区TOP 计算机类&#xff08;含CCF&#xff09;&#xff1b; ●EI快刊&#xff1a;最快1周录用&#xff01; 知网(CNKI)、谷歌学术期刊 ●7天录用-检索&#xff08;100%录用&#xff09;&#xff0c;1周上线&#xff1b; 免费稿件评估 免费匹配…...

神经网络问题之:梯度不稳定

梯度不稳定是深度学习中&#xff0c;特别是在训练深度神经网络时常见的一个问题&#xff0c;其本质涉及多个方面。 一、根本原因 梯度不稳定问题的根本原因在于深度神经网络的结构和训练过程中的一些固有特性。随着网络层数的增加&#xff0c;梯度在反向传播过程中会逐层累积变…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

字符串哈希+KMP

P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...