事务

news2024/9/20 14:52:50

    • 事务
    • 回顾MySQL事务
    • Spring事务实现
      • 编程式事务实现:
      • 声明式事务
    • @Transactional 注解
      • 作用范围及名称(value/transactionManager)
      • 隔离级别:isolation
      • 超时时间:timeout
      • 修改只读事务
      • 指定异常
      • 异常捕获情况
    • 事务失效场景
    • @Transactional原理

事务

什么是事务?
把一组操作封装成一个执行单元;要么一起成功;要么一起失败。比如转账;账户A:-100 账户B:+100;不能扣了钱却发现没到账。
事务分类:
1:编程式;手动写代码操作事务

2:声明式;利用注解自动开启和提交事务

回顾MySQL事务

把MySQL的索引、事务博客写一下;链接扔这里来。先复习完MySQL事务对这个也有帮助
回顾;你先复习一下;不写博客先;这样子就能省点时间

Spring事务实现

创建Spring boot项目;添加:lombok、mysql、mybatis、Spring web依赖。mybatis配置:保存一下;当要用的时候能方便找到即可
事务操作:通过事务管理器(DataSourceTransactionManager)这个对象操作;而你要得到事务就还得传另一个对象TransactionDefinition

# 配置数据库的连接字符串
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mycnblog?characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=111111
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis.mapper-locations=classpath:mybatis/*Mapper.xml
# 配置打印 MyBatis 执行的 SQL
mybatis.configuration.log-impl:org.apache.ibatis.logging.stdout.StdOutImpl
# 配置打印 MyBatis 执行的 SQL
logging.level.com.mybatis.demo=debug

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
</mapper>

编程式事务实现:

事务就是操作数据过程里的一个步骤;所以我们构造这样的一个场景;然后看看是否实现开启事务、提交事务、最后回滚事务功能。
在这里插入图片描述

各个部分代码如下:
在Controller中进行try catch异常处理更严谨一些;不然在调用时遇到异常 ;事务就挂在那里也没提交和回滚。出现异常就进行回滚事务。
在这里插入图片描述

声明式事务

通过注解实现;在⽅法上添加 @Transactional 注解⽆需⼿动开启事务和提交事务。进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了没有处理的异常会⾃动回滚事务。(通过简介对比;发现和编程式事务没有对比就没有伤害)
在这里插入图片描述
当你测试时在上述代码进行算数异常:int num=10/0;他就会进行回滚事务。

@Transactional 注解

事务回滚和单元测试回滚:
这里事务回滚是发生异常回滚;正常执行则提交事务。单元测试则是执行完方法后一定回滚事务。所以单元测试和正常代码的@Transactional 注解含义不同
在这里插入图片描述

作用范围及名称(value/transactionManager)

1:只能应用到public方法;在其它的则不生效
2:修饰类时表明对类中所有public方法生效
参数:
作用一模一样;value和transactionManager描述的是同一个东西
在这里插入图片描述
在这里插入图片描述

隔离级别:isolation

在这里插入图片描述
在这里插入图片描述

Spring事务隔离级别5种;多了下面这种;这种以连接数据库的隔离级别为准。mysql默认的是可重复读。(isolation = DEFAULT 表示使用默认的数据库事务隔离级别)
在这里插入图片描述
事务级别设置:
在这里插入图片描述
或者直接:isolation=-1;还是使用枚举比较不容易出错

超时时间:timeout

负一表示没有超时时间;设置的是3;超时时间就是3秒;方法执行超过3秒就自动回滚操作,谨慎使用。
在这里插入图片描述

修改只读事务

1:普通事务(默认的事务传播行为下的一种普遍场景)
2:只读事务;没有隔离级别;可重复读
3:无事务;默认的隔离级别;可重复读
只读事务的隔离级别是可以修改的;可控。无事务是你修改不了隔离级别的。
默认情况下read-only=false(普通事务);当设置read-only=true为只读事务;对于那些读就能满足需求的事务性能就会提升。
在这里插入图片描述

指定异常

描述但是一个事情–异常;但是我们一般但是发生异常都回滚
在这里插入图片描述

异常捕获情况

@Transactional注解在异常被捕获的情况下;是不会进行事务的回滚。当我们对下面算数异常的代码进行异常处理;事务是不会回滚的,选中这个算数异常的代码ctrl+alt+t。
在这里插入图片描述
相当于环绕通知;你代码抛异常;但是被你自己吃掉了这个异常;然后你没有抛异常;环绕通知就感知不到异常;它就正常进行执行代码(Spring知道这个异常;同时也知道你处理了这个异常;既然你已经知道异常且处理了;那么Spring就认为是没有问题;不需要自己再去处理异常)
解决方案:
1:将异常抛出去;让框架感知异常后就会回滚事务
在这里插入图片描述

2:在你自己代码处理异常手动回滚事务
在这里插入图片描述

事务失效场景

1:非public修饰的方法
2:timeout超时
3:代码中有try/catch
4:调用类内部@Transactional方法
当调用类内部的 @Transactional 修饰的方法时,事务是不会生效的。如下并不会回滚事务
在这里插入图片描述
5:数据库不支持事务
@Transactional 本质上给调用的数据库发送了:开始事务、提交事务、回滚事务的指令
如果数据库本身不支持事务,比如 MySQL 中设置了使用 MyISAM 引擎,那么它本身是不支持事务的,这种情况下,即使在程序中添加了 @Transactional 注解,那么依然不会有务的行为,

@Transactional原理

基于AOP实现;AOP ⼜是使⽤动态代理实现的。如果⽬标对象实现了接⼝,默
认情况下会采⽤ JDK 的动态代理,如果⽬标对象没有实现了接⼝,会使⽤ CGLIB 动态代理。
在这里插入图片描述
AOP 切面织入:当一个被 @Transactional 注解修饰的方法被调用时,Spring AOP 会在方法执行前后织入事务管理的逻辑。
动态代理:Spring AOP 在运行时动态生成代理对象,将事务管理的逻辑添加到代理对象中。
事务管理器:在 Spring 的配置中需要配置一个事务管理器来管理和协调事务的操作。
注解解析:在启动时,Spring 扫描并解析带有 @Transactional 注解的类和方法,解析注解上的属性如事务的传播行为、隔离级别等。
事务开始和提交:在方法调用之前,事务管理器在数据库连接上开启一个新的事务。方法执行完成后,若无异常抛出,则事务管理器提交事务;否则回滚事务。

生成的代理对象:
事务切面:代理对象包含了事务的管理逻辑,例如事务的开始、提交或回滚等。通过代理对象,只是通过正常调用方法即可。
范围和配置:代理对象可以根据配置定义哪些类或方法需要被代理并应用事务管理。这样可以灵活控制事务的切入点和范围,满足不同场景下的事务需求。
使用环绕通知,Spring 可以在方法调用前开启事务,并在方法调用后根据方法执行情况决定是否提交或回滚事务。

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

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

相关文章

高等数学II-知识点(1)——原函数的概念、不定积分、求原函数的两种常用方法 (凑微分法、第二换元法)、分部积分法、有理函数原函数求法、典型三角函数原函数求法

目录 原函数的概念 不定积分 定义 不定积分的基本积分公式 不定积分的运算法则 求原函数的两种常用方法 第一换元法&#xff08;凑微分法&#xff09; 第二换元法 分部积分法 有理函数原函数求法 典型三角函数原函数求法 原函数的概念 设在区间上有定义&#xff0c…

Python3 实例(一) | 菜鸟教程(十九)

目录 一、Python Hello World 实例 二、 Python 数字求和 &#xff08;一&#xff09;以下实例为通过用户输入两个数字&#xff0c;并计算两个数字之和&#xff1a; &#xff08;二&#xff09;两数字运算&#xff0c;求和我们使用了加号 ()运算符&#xff0c;除此外&#…

GB51309实施后对于消防应急照明和疏散指示系统在城市隧道应用中的影响

安科瑞 崔丽洁 【摘要】&#xff1a;应急照明和疏散指示系统被广泛运用于城市隧道、楼宇建筑、地下管廊等各个方面。当隧道这类特殊建筑内出现火灾或事故时&#xff0c;可靠的应急照明和疏散指示系统对于人员的安全逃生有着重要的作用。随着GB51309-2018《消防应急照明和疏散指…

java从入门到起飞(三)——三大结构(顺序结构、分支结构、循环结构)

目录 前提顺序结构分支结构if选择语句switch语句 循环结构for循环语句格式while循环语句格式do…while循环语句三种循环的区别三种循环的区别&#xff1a;for和while的区别&#xff1a;死循环格式&#xff1a; 前提 三大结构也成为流程控制语句&#xff0c;分为三大类&#xff…

flask+uwsgi+docker+nginx 云服务器部署测试平台

flaskuwsgidockernginx 云服务器部署测试平台 开发环境 本次主要是在腾讯云上进行部署&#xff0c;系统是CentOS 7.9 64位&#xff0c;主要使用的软件如下&#xff1a; Python 3.9.5 Pycharm Flask1.0.2 Mysql 5.7 nginx uwsgi 一 安装Nginx 1.更新yum 源 sudo rpm -ivh …

基于Java+Swing+Mysql图书信息管理系统

基于JavaSwingMysql图书信息管理系统 一、系统介绍二、功能展示1.主页2.新增图书信息3.删除图书信息 三、数据库四、其他系统实现五、获取源码 一、系统介绍 该系统实现了查看图书列表、新增图书信息、删除图书信息 运行环境&#xff1a;eclipse、idea、jdk1.8 二、功能展示…

TCP的三次握手,四次挥手

1.TCP协议介绍 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c;是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。由IETF的RFC 793 [1] 定义…

云之道知识付费v2 3.1.1独立版小程序系统源码

云之道知识付费v2 3.1.1独立版小程序系统源码 很不错的一款知识丰富小程序&#xff0c;感兴趣的可以自己下载搭建尝试一下。

Java官方笔记13集合

Storing Data The Collections Framework is the most widely used API of the JDK. 集合不是数据类型&#xff0c;它是JDK的API&#xff0c;可以用来存储数据等&#xff0c;相当于数据结构。 the Collections Framework is a set of interfaces that models different way of …

chatgpt赋能python:用Python做中文词云

用Python做中文词云 介绍 中文词云是一种常见的数据可视化方式&#xff0c;通过将文本中出现频率较高的关键词以图形的形式展现出来&#xff0c;让人一眼就能了解文本内容的主题和关键词。在搜索引擎优化&#xff08;SEO&#xff09;方面&#xff0c;中文词云也常被用来帮助分…

【python】使用Antlr4实现识别sql中的表或视图名

前言 先上成果预览图吧 作为一个数据库sql开发者,肯定有很多人和我一样,想要有一个工具,能传入任意sql,解析出sql中的所有表。 我之前有一篇文章【AIO】将任意查询sql转换成带远程数据库DBLINK的sql 中就提到了,使用纯文本硬解析会存在很多不确定因素,比如oracle新版本…

截取屏幕中指定区域的图像pyautogui.screenshot(区域)

【小白从小学Python、C、Java】 【等级考试500强双证书考研】 【Python-数据分析】 截取屏幕中指定区域的图像 pyautogui.screenshot(区域) [太阳]选择题 关于以下代码说法错误的是&#xff1a; import pyautogui print("【执行】pyautogui.screenshot(region(0,0,2…

麦语言入门~001课

麦语言是一种编程语言&#xff0c;它是由麦肯锡公司开发的一种专门用于数据分析和统计建模的语言。麦语言具有类似于R和Python的功能&#xff0c;并提供了一组丰富的数据处理、统计分析和机器学习的工具。麦语言主要用于解决复杂的商业和统计分析问题&#xff0c;并被广泛应用于…

CRM系统能帮助外贸企业提高哪些工作效率?

外贸企业的业务和客户遍布世界各地&#xff0c;更涉及不同的语言和文化。因此&#xff0c;管理客户信息、提高服务质量、扩大市场份额成为了外贸企业亟待解决的问题。针对这些情况&#xff0c;不少企业开始使用CRM客户管理系统。下面说说&#xff0c;外贸企业为什么要用CRM系统…

Spring面试题--Spring的bean的生命周期

这个问题比较困难&#xff0c;设计到了spring的底层&#xff0c;但是通过这个的学习&#xff0c;可以帮助我们了解Spring容器是如何管理和创建bean实例&#xff0c;以及方便调试和解决问题。 BeanDefinition bean的定义信息&#xff0c;Spring容器在进行实例化时&#xff0c;…

11-C++算法01-枚举排序

&#x1f4d6; C算法 在编程中&#xff0c;算法是解决问题的一系列步骤或规则。在C中&#xff0c;提供了丰富的算法库&#xff0c;可以方便地进行各种常见的算法操作。本篇学习笔记将介绍一些常见的排序算法&#xff0c;帮助你理解和应用这些算法。 &#x1f680; 枚举 &…

C语言VS Code 开发环境搭建

文章目录 官方文档安装拓展生成c_cpp_properties.json生成tasks.json生成launch.json测试Debug如何让程序debug完不退出&#xff1f;Windows版本的配置GDB和LLDB的区别 由于之前使用VS Code较少&#xff0c;缺少在VS Code上开发C程序的经验。本篇博文主要记录使用VS Code开发C程…

基于Tars高并发IM系统的设计与实现-基础篇2

基于Tars高并发IM系统的设计与实现-基础篇2 三大指标 高可用 分为服务高可用与存储高可用。 服务高可用 服务高可用要做到高可用必须具备两个特点&#xff1a; 负载均衡可横行扩展 当服务的请求量比较高的时候&#xff0c;一台服务不能满足需求&#xff0c;这时候需要多…

sklearn.preprocessing模块介绍

数据预处理 Binarizer: 二值化 用于将数值特征二值化。它将特征值与给定的阈值进行比较&#xff0c;并将特征值转换为布尔值&#xff08;0 或 1&#xff09;&#xff0c;取决于特征值是否超过阈值 Binarizer(*, threshold0.0, copyTrue)参数&#xff1a; threshold&#xf…

AGI—从GPT和大型语言模型中汲取的经验教训

点击蓝字 关注我们 关注并星标 从此不迷路 计算机视觉研究院 公众号ID&#xff5c;计算机视觉研究院 学习群&#xff5c;扫码在主页获取加入方式 论文地址&#xff1a;https://arxiv.org/pdf/2306.08641.pdf 计算机视觉研究院专栏 Column of Computer Vision Institute 人工智能…