Spring挖掘: (事务篇)

news2024/11/23 19:28:00

谈到事务,我们就绕不开事务的ACID四大特性,我们先来简单介绍一下何为事务

一. 概念

事务是数据库操作的最小工作单元,作为单个逻辑工作单元执行的一系列操作。这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行。事务是一组不可再分割的操作集合,具有四个关键特性,即ACID特性

  1. 原子性(Atomicity):事务不可分割,事务中包括的动作要么都做,要么都不做。事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
  2. 一致性(Consistency):事务执行后,数据库的状态必须满足所有的约束和规则,保证数据的一致性。事务必须保证数据库从一个一致性状态变到另一个一致性状态。
  3. 隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相打扰。
  4. 持久性(Durability):一旦事务成功完成并提交,它对数据库中数据的改变就是永久性的,接下来的其他操作或故障不应该对其执行结果有任何影响。

二. @Transactional

Spring的事务为我们提供了非常便携的事务功能,只需要你添加@Transactional注解即可.

但需要注意的是,Spring的事务是需要数据库本身具有事务功能的支撑,才能完成事务的功能,也就是他是基于数据库的事务功能进行的.没有数据库事务的支持,Spring是无法提供事务功能的.

我们就从这个注解入手,来看看Spring是怎么完成事务的功能的设计的.

这是注解内的三个属性,简单解释一下他们的含义

2.1 value 与 transactionManager

value与transactionManager表示的是同一个意思,@AliasFor这个注解的含义就是别名,他两的别名都分别对应着彼此,所以这两个属性是一样的.那作用是什么呢? 这两个其实是用来设置你用哪个事务管理器来处理你的事务.

其实对应着就是需要去实现Spring的一个接口TransactionManager

在这个接口下有许多的父接口,其中我们需要知道的就是这个PlatformTransationManger接口

这里用三个方法

  • 第一个方法(getTransaction): 获取事务的状态
  • 第二个方法(commit): 提交事务
  • 第三个方法(rollback): 事务的回滚

也就是简单来讲,这个事务管理器就是用来控制事务的获取、提交、回滚。

那Spring底层是使用哪个具体的实现类呢,我们测试来看看

测试结果为

说明Spring底层的事务管理器是JdbcTransactionManager.

2.2 label

就是一个标签,用来表明这个事务是为了处理什么样的业务场景. 例如现在这个方法是用来处理转账流程的一个业务.那么就可以设置这个label属性为转账.这个作用并不大.平常基本也不使用.

我们接着查看其他属性

2.3 timeout与timeoutString

这两个其实是一样的含义,都表示超时时间,只不过一个是用int类型输入,一个是以字符串的形式输入.默认单位为秒

2.4 readOnly

如果当前事务只与读有关,那么可以开启这个属性,默认情况是false,是不开启的.Spring会对只读事务进行一些性能上的优化.

剩下还有几个属性,如下图所示,几个控制回滚条件.

2.5 rollbackFor 与 rollbackForClassName

rollbackFor以及rollbackForClassName都是用来指定回滚触发的异常是什么,一个是填写类的class,一个是填写类的全限类名的字符串形式.Spring默认的回滚触发的异常是RuntimeException(运行时异常)或者Error异常.

回顾一下异常体系

另外两个noRollbackFor与noRollbackForClassName是类似的,就是指定发生什么异常时不需要回滚,这里就不再赘述了.

重点是接下来两个属性

2.6 propagation(传播级别)

传播级别的含义为,一个大事务里面会有很多的小事务,而传播级别就是用来控制各个事务之间的关系,是包含还是独立,本身的事务出现状况是否会影响其他的事务.

我们大概能把REQUIRED与REQUIRES_NEW分清楚就行,其他的很少使用.

REQUIRED简单理解就是上别人的车.

REQUIRES_NEW就是我自己开车.

举三个例子

A{
    B(){  //REQUIRED
        F();//REQUIRES_NEW
        G();//REQUIRED
        H();//REQUIRES_NEW
    }
    C(){  //REQUIRES_NEW
       I();//REQUIRES_NEW
       J();//REQUIRED 
    }
    D(){   //REQUIRES_NEW
        K();//REQUIRES_NEW
        L();//REQUIRES_NEW //点位2 
    }
    E(){   //REQUIRED
        M();//REQUIRED
         //点位3
        N();//REQUIRES_NEW
    }
    // 点位1
}
  • 假设在点位1炸了,出现了异常,会导致什么现象呢?
    • A事务肯定得炸,那么绑定A事务的会收到牵连
    • B事务绑定A,B也炸,G绑定B,所以G事务也会炸.
    • E事务绑定A,E也炸,M绑定E,所以M事务也会炸
  • 假设在点位2炸了,出现了异常,会导致什么现象呢?
    • L炸了,由于异常机制将会向上抛,所以会导致D事务也炸了
    • D事务炸,A事务也会跟着炸
    • 那么后续也就跟点位1的情况一样了.但是E还会炸吗?答案是不会的,因为点位2炸了过后都不会在向下执行
  • 假设在点位3炸了,出现了异常,会导致什么现象呢
    • 那么会导致E炸了,绑定在E事务的M肯定也炸,异常向上抛,所以A事务也得炸
    • A炸还是跟点位1炸了的后续一样,只不过N不受影响,因为不会执行到N处

2.7 Isolation (隔离级别)

Spring提供了四种隔离级别,其实跟我们学习MySQL的事务隔离级别是一样的.

  • DEFAULT: 默认隔离级别,以连接的数据库的默认级别为准.例如连接的是MySQL数据库,那就以MySQL的隔离级别为准,MySQL默认为REPEATABLE_READ,那么此时就是REPEATABLE_READ.
  • READ_UNCOMMITTED: 读未提交.读到未提交的数据.产生脏读
  • READ_COMMITTED: 读已提交.读到已提交事务的数据.产生不可重复读
  • REPEATABLE_READ: 可重复读. 在同一个事务下可以重复读取到相同的数据.产生幻读
  • SERIALIZABLE: 串行化. 所有事务串行执行.

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

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

相关文章

Information Server 中共享开源服务中 kafka 的__consumer_offsets目录过大清理

1,11.7新版本的 IBM InfoSphere Information Server 将 Apache Kafka、Solr 和 ZooKeeper 安装在<ISHOME>服务层的 /shared-open-source 目录中。 默认情况下&#xff0c;共享开源中的 Kafka 对 __consumer_offsets 主题使用“压缩”日志清理策略&#xff0c;这可能会导…

Linux系统程序设计--2. 文件I/O

文件I/O 标准C的I/O FILE结构体 下面只列出了5个成员 可以观察到&#xff0c;有些函数没有FILE类型的结构体指针例如printf主要是一些标准输出&#xff0c;因为其内部用到了stdin&#xff0c;stdout&#xff0c;stderr查找文件所在的位置:find \ -name stat.h查找头文件所…

linux网络的基本设置

1、查看网络接口信息 ip a/ip addr #简略的查看网络接口信息 ifconfig #只显示当前活跃的设备 ifconfig -a #实现当前主机的所有网络设备&#xff0c;包括未运行的设备 rootubuntu1:~# ifconfig ens33:flags4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 设备名…

利用AI制作《职业生涯规划PPT》,10分钟完成

职业生涯规划是大学生活中非常重要的一环。通过制定职业规划&#xff0c;你能够明确未来的职业目标、认清自身的优劣势&#xff0c;进而制定切实可行的计划&#xff0c;以便顺利踏上职业发展的道路。而制作一份精美的职业生涯规划PPT&#xff0c;能有效帮助你在面试、职业规划报…

【数据结构与算法】希尔排序(直接插入排序)

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 引言 一.直接插入排序的基本思想 二. 直接插入排序算法解析 详细版本的算法思想解析 算法思想提炼 实现代码 画图刨析 三. 直接插入排序的特性 复杂度分析 稳定性分析 四. 希尔排序的基本思想 五. 希尔排序算法解…

RK3568 Android12跳过认证 预置谷歌服务GMS

在Rom开发中需要发布海外版本时基本都需要内置google服务,而规范方式集成的话都需要设备进行认证,获取google应用签名等非常复杂的一套流程,一般大厂才有这些资质和资源,这里介绍一种非常规方式集成GMS,跳过设置认证流程,在RK3568 android12环境亲测有效。 谷歌全家桶中…

深度学习之卷积问题

1 卷积在图像中有什么直观作用 ​ 在卷积神经网络中&#xff0c;卷积常用来提取图像的特征&#xff0c;但不同层次的卷积操作提取到的特征类型是不相同的&#xff0c;特征类型粗分如表1所示。 ​ 表1 卷积提取的特征类型 卷积层次特征类型浅层卷积边缘特征中层卷积局部特征深…

Go语言的内置容器

文章目录 一、数组数组的定义数组声明数组特点数组元素修改 二、切片切片声明基于数组创建切片使用make()函数构造切片使用append()为切片动态添加元素\使用copy()复制新的切片数组与切片相互转换 三、Map映射Map定义使用make()函数创建map用切片作为map的值使用delete()函数删…

二叉树的各种操作补充

二叉树的各种操作补充 求二叉树的结点数求二叉树的叶结点数求二叉树的高度求二叉树的第k层结点数查找指定结点层序遍历判断二叉树是否是完全二叉树 我们任然沿用二叉树的基本信息&#xff1a; typedef char BTDataType; typedef struct BinaryTreeNode {BTDataType _data;struc…

Go语言的常用内置函数

文章目录 一、Strings包字符串处理包定义Strings包的基本用法Strconv包中常用函数 二、Time包三、Math包math包概述使用math包 四、随机数包&#xff08;rand&#xff09; 一、Strings包 字符串处理包定义 Strings包简介&#xff1a; 一般编程语言包含的字符串处理库功能区别…

Perfetto中如何使用SQL语句

在使用 Perfetto 分析 Android 性能时&#xff0c;可以通过 Perfetto 提供的内置 SQL 查询来提取和分析不同的性能数据。Perfetto 允许你在 UI 界面或命令行中运行 SQL 查询&#xff0c;提取出 Trace 数据中包含的各种性能信息&#xff0c;比如 CPU 使用率、线程状态、内存分配…

QML项目实战:自定义TextField

目录 一.添加模块 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.4 import QtGraphicalEffects 1.15 二.自定义TextField 1.属性设置 2.输入框设置 3.按钮开关 三.效果 1.readonly为false 2.readonly为true 四.代码 一.添加模块 import QtQuick.…

【进阶】Stable Diffusion 插件 Controlnet 安装使用教程(图像精准控制)

Stable Diffusion WebUI 的绘画插件 Controlnet 最近更新了 V1.1 版本&#xff0c;发布了 14 个优化模型&#xff0c;并新增了多个预处理器&#xff0c;让它的功能比之前更加好用了&#xff0c;最近几天又连续更新了 3 个新 Reference 预处理器&#xff0c;可以直接根据图像生产…

DAF-FM DA与NO反应后,生成的产物能够发出强烈的绿色荧光,254109-22-3

一、基本信息 产品名称&#xff1a;DAF-FM DA&#xff08;一氧化氮NO荧光探针DAF-FM&#xff09; 英文名称&#xff1a;DAF-FM DA&#xff0c;DAF-FM diacetate CAS号&#xff1a;254109-22-3 分子式&#xff1a;C25H18F2N2O7 供应商&#xff1a;陕西新研博美生物科技 分…

在 Mac 和 Windows 系统中快速部署 OceanBase

OceanBase 是一款分布式数据库&#xff0c;具备出色的性能和高扩展性&#xff0c;可以为企业用户构建稳定可靠、灵活扩展性能的数据库服务。本文以开发者们普遍熟悉的Windows 或 Mac 环境为例&#xff0c;介绍如何快速上手并体验OceanBase。 一、环境准备 1. 硬件准备 OceanB…

使用Ant Design的Layout布局不能撑满整个屏幕问题解决方法

代码示例&#xff1a; import React, { useState } from react import {LaptopOutlined,NotificationOutlined,UserOutlined, } from ant-design/icons import type { MenuProps } from antd import { Layout, Menu, theme } from antd import routes from ./routes/index imp…

【ubuntu18.04】使用U盘制作ubuntu18.04启动盘操作说明

打开show application 打开Startup Disk 选择镜像 双击选择ubuntu的iso镜像 镜像下载地址 Ubuntu 18.04.6 LTS (Bionic Beaver) 制作镜像 注意&#xff1a; 制作镜像会格式化U盘&#xff0c;记得备份资料 点击Make Startup Disk,弹出如下对话框 点击Yes 输入管理员密码&a…

22.04Ubuntu---ROS2创建python节点

创建工作空间 mkdir -p 02_ros_ws/src 然后cd到该目录 创建功能包 在这条命令里&#xff0c;tom就是你的功能包 ros2 pkg create tom --build-type ament_python --dependencies rclpy 可以看到tom功能包已经被创建成功了。 使用tree命令&#xff0c;得到如下文件结构 此时…

《手写Spring渐进式源码实践》实践笔记(第十七章 数据类型转换)

文章目录 第十七章 数据类型转换工厂设计实现背景技术背景Spring数据转换实现方式类型转换器&#xff08;Converter&#xff09;接口设计实现 业务背景 目标设计实现代码结构类图实现步骤 测试事先准备属性配置文件转换器工厂Bean测试用例测试结果&#xff1a; 总结 第十七章 数…

使用docker形式部署jumpserver

文章目录 前言一、背景二、使用步骤1.基础环境准备2.拉取镜像3.进行部署4.备份记录启动命令 前言 记录一下使用docker形式部署jumpserver服务的 一、背景 搭建一个jumpserver的堡垒机&#xff0c;但是发现之前是二进制文件部署的&#xff0c;会在物理机上部署污染环境&#x…