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

Spring的事务管理

Spring的事务管理

    • Spring的事务管理
      • 1、事务的回顾
        • 【1】事务的定义
        • 【2】事务的ACID原则
      • 2、spring事务API介绍【了解】
        • 【1】PlatformTransactionManager
          • 【1.1】PlatformTransactionManager作用
          • 【1.2】PlatformTransactionManager接口
          • 【1.3】PlatformTransactionManager实现类
        • 【2】TransactionDefinition
          • 【2.1】TransactionDefinition作用
          • 【2.2】TransactionDefinition接口
          • 【2.3】事务隔离级别
            • 【2.3.1】为什么要事务隔离?
            • 【2.3.2】spring事务隔离级别
          • 【2.4】事务传播行为

Spring的事务管理

1、事务的回顾

【1】事务的定义

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

【2】事务的ACID原则

事务具有4个基本特性:原子性、一致性、隔离性、持久性。也就是我们常说的ACID原则

  • 原子性(Atomicity):
    一个事务已经是一个不可再分割的工作单位。事务中的全部操作要么都做;要么都不做

    例如:A和B两个人一共1000元,A给B转账100元,A付款100元,B收款100元,A的付款行为和B的收款行为要么都成功,要么都失败
    
  • 一致性(Consistency):
    事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。

    例如:A和B两个人一共1000元,无论A,B两人互相转账多少次,A和B两个人总额都应该是1000元
    
  • 隔离性(Isolation):
    事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性 和完整性。同时,并行事务的修改必须与其他并行事务的修改相互独立。

例如:万达影院有《叶问4》电影票100张,允许所有人同时去淘票票上购票,当第100张电影票被A,B,C3人同时购买,如果A拿到第100张电影票,但是还在犹豫要不要付钱,则B,C必须等待A的决定,如果A决定付钱,B.C就无法抢到票,如果A超时不付钱,则这第100张电影票回归票池,从新分配。

  • 持久性(Durability):
    一个事务一旦提交,它对数据库中数据的改变会永久存储起来。其他操作不会对它产生影响

    例如:万达影院有《叶问4》电影票100张,100张电影票销售完毕,对于每个购买者来说,他的购买记录已经产生,即使退票,他之前的购买记录也不会消失。
    

2、spring事务API介绍【了解】

【1】PlatformTransactionManager

【1.1】PlatformTransactionManager作用

​ PlatformTransactionManager【事务平台管理器】:是一个接口,定义了获取事务、提交事务、回滚事务的接口

【1.2】PlatformTransactionManager接口
public interface PlatformTransactionManager {//根据事务定义TransactionDefinition,获取事务TransactionStatus getTransaction(TransactionDefinition definition);//提交事务void commit(TransactionStatus status);//回滚事务void rollback(TransactionStatus status);}
【1.3】PlatformTransactionManager实现类

事务平台管理器PlatformTransactionManager定义了标准,他有如下经常使用的实现

PlatformTransactionManager的实现类说明
org.springframework.jdbc.datasource.DataSourceTransactionManagerDataSource 数据源的事务
org.springframework.orm.hibernateX.HibernateTransactionManagerHibernate 事务管理器。
org.springframework.orm.jpa.JpaTransactionManagerJPA 事务管理器
org.springframework.transaction.jta.JtaTransactionManager多个数据源的全局事务管理器
org.springframework.orm.jdo.JdoTransactionManagerJDO 事务管理器

【2】TransactionDefinition

【2.1】TransactionDefinition作用

TransactionDefinition【事务定义信息】:是一个接口,定义了事务隔离级别、事务传播行为、事务超时时间、事务是否只读

【2.2】TransactionDefinition接口
public interface TransactionDefinition {/**********************事务传播行为类型常量***********************************///事务传播行为类型:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。int PROPAGATION_REQUIRED = 0;//事务传播行为类型:支持当前事务,如果当前没有事务,就以非事务方式执行。 int PROPAGATION_SUPPORTS = 1;//事务传播行为类型:当前如果有事务,Spring就会使用该事务;否则会抛出异常int PROPAGATION_MANDATORY = 2;//事务传播行为类型:新建事务,如果当前存在事务,把当前事务挂起。 int PROPAGATION_REQUIRES_NEW = 3;//事务传播行为类型:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 int PROPAGATION_NOT_SUPPORTED = 4;//事务传播行为类型:即使当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常int PROPAGATION_NEVER = 5;//事务传播行为类型:如果当前存在事务,则在嵌套事务内执行。int PROPAGATION_NESTED = 6;/**********************事务隔离级别常量***********************************///MySQL默认采用ISOLATION_REPEATABLE_READ,Oracle采用READ__COMMITTED级别。)//隔离级别:默认的隔离级别()int ISOLATION_DEFAULT = -1;//隔离级别:读未提交(最低)int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;//隔离级别:读提交int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;//隔离级别:可重复度int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;//隔离级别:序列化操作(最高)int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;//默认事务的超时时间int TIMEOUT_DEFAULT = -1;//获取事务的传播行为int getPropagationBehavior();//获取事务的隔离级别int getIsolationLevel();//获取超时时间int getTimeout();//是否只读boolean isReadOnly();//事务名称String getName();
}
【2.3】事务隔离级别
【2.3.1】为什么要事务隔离?

如果没有定义事务隔离级别:

  • 脏读

​ 在一个事务中读取到了另外一个事务修改的【未提交的数据】,而导致多次读取同一个数据返回的结果不一致 (必须要解决的)

例如:1.事务1,小明的原工资为1000, 财务人员将小明的工资改为了8000【但未提交事务】2.事务2,小明读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!3.事务1,财务发现操作有误,回滚了操作,小明的工资又变为了1000像这样,小明读取的工资数8000是一个脏数据
  • 不可重复读

​ 在一个事务中读取到了另外一个事务修改的【已提交的数据】,而导致多次读取同一个数据返回的结果不一致

例如:1.事务1,小明读取了自己的工资为1000,操作还没有完成 2.事务2,这时财务人员修改了小明的工资为2000,并提交了事务.3.事务1,小明再次读取自己的工资时,工资变为了2000
  • 幻读(虚读):

    ​ 一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录

例如:   1.事务1,财务统计所有工资为5000的员工有10人。2.事务2,人事向user表插入了一条员工记录,工资也为50003.事务1,财务再次读取所有工资为5000的员工 共读取到了11条记录,明明刚刚是10人啊?产生幻觉了?

事务隔离就是帮助我们解决:脏读、不可重复读、幻读(虚读)

【2.3.2】spring事务隔离级别

隔离级别由低到高【读未提交】=>【读已提交】=>【可重复读】=>【序列化操作】

隔离级别说明脏读不可重复读幻读
ISOLATION_DEFAULTspring默认数据库的隔离级别
ISOLATION_READ_UNCOMMITTED读未提交
ISOLATION_READ_COMMITTED读已提交×
ISOLATION_REPEATABLE_READ可重复读××
ISOLATION_SERIALIZABLE序列化操作×××

对大多数数据库来说就是READ_COMMITTED(读已提交)

MySQL默认采用REPEATABLE_READ(可重复读),

Oracle采用READ__COMMITTED()

Spring的隔离级别默认数据库的隔离级别:ISOLATION_DEFAULT

【2.4】事务传播行为

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

传播行为说明
REQUIRED当前如果有事务,Spring就会使用该事务;否则会开始一个新事务(增、删、改)
SUPPORTS当前如果有事务,Spring就会使用该事务;否则不会开始一个新事务(查询)
MANDATORY当前如果有事务,Spring就会使用该事务;否则会抛出异常
REQUIRES_NEW当前如果有事务,把当前事务挂起,新建事务
NOT_SUPPORTED当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则该事务挂起
NEVER当前有事务,Spring也会在非事务环境下执行。如果当前有事务,则抛出异常
NESTED当前有事务,则在嵌套事务中执行。如果没有,那么执行情况与REQUIRED一样

【默认】REQUIRED:当前如果有事务,Spring就会使用该事务;否则会开始一个新事务

相关文章:

Spring的事务管理

Spring的事务管理Spring的事务管理1、事务的回顾【1】事务的定义【2】事务的ACID原则2、spring事务API介绍【了解】【1】PlatformTransactionManager【1.1】PlatformTransactionManager作用【1.2】PlatformTransactionManager接口【1.3】PlatformTransactionManager实现类【2】…...

MCAL知识点(十六):VADC驱动配置详解(理论基础篇)

目录 1、概述 2、EB配置 2.1、通用界面配置 2.1.1、General 2.1.2、AdcConfigSet_0 2.1.3、AdcGlobinputClass 2.1.4、AdcHwUn...

MySQL--库的操作--校验规则对于数据库的影响--0409

目录 1.库的基础操作 查看数据库 创建数据库 删除数据库 查看建库语句 修改数据库 2.字符集和字符集校验规则 2.1 查看系统默认字符集以及校验规则 2.2 使用特定的字符集创建数据库 2.3 不同校验规则对数据库的影响 2.3.1 大小写验证 2.3.2 排序验证 3.备份和恢复 3.1…...

markdown-it基本使用

markdown-it能够将markdown语法的内容转换为html内容,这样我们使用markdown语法写的笔记,就可以转换作为网页使用了 Markdown语法 Markdown语法图文全面详解(10分钟学会) 基础使用 安装markdown-it npm install markdown-it --save使用markdown-it …...

CMake入门教程【核心篇】8.3对象库

文章目录 知识点实例代码目录代码实现知识点 add_library(libhello OBJECT src/hello.cpp)使用OBJECT 参数可以把对象传入到libhello 中,且不会生成.lib文件 使用变量$<TARGET_OBJECTS:libhello>即可获取,比较实用 实例 代码目录 |-📁prj10   |-- 🎴CMakeLists…...

单片机_CT107D训练平台电路原理图\蓝桥杯训练板\IO扩展模块\74HC138译码器

74HC138译码器&#xff08;实现3个IO口控制8个引脚实现IO口的扩展&#xff09; 配置信号放大模块&#xff0c;可以对输入的低电压模拟信号进行放大&#xff1b; 配置 138 译码器&#xff0c;可以做译码实验&#xff1b; 外设可以用存储器映射方式访问&#xff0c;也可以直接控…...

Rabbitmq消息确认机制

1.生产者确认机制 确认消息发送到交换机--Confirm方式 1.1普通Confirm方式 private static void sendMsg(Channel channel) throws IOException, InterruptedException { //开启确认机制 channel.confirmSelect(); //发送消息到exchange St…...

FinClip 云开发实践(附小程序demo)

在开发一个小程序时&#xff0c;除了考虑界面功能逻辑外&#xff0c;还需要后端的数据支持&#xff0c;开发者需要提前考虑服务器、存储和数据库等相关需求的支持能力&#xff0c;此外还可能需要花费时间精力在部署应用、和依赖服务的建设上。 ​ 因此&#xff0c;腾讯小程序为…...

真正好用的工业品ERP系统应该是什么样的?

一个好用的进销存ERP系统应该有以下特点&#xff1a; 1. 全面覆盖企业经营流程&#xff0c;包括采购、销售、库存、财务等模块&#xff0c;能够实现全方位的管理和控制。 2. 自定义配置&#xff0c;灵活地适应大多数用户的需求。 3. 数据精准、实时化&#xff0c;支持统计分…...

Shiro重定向

使用了统一认证&#xff0c;然后每次登录&#xff0c;不能定向到用户指定的界面&#xff0c;非得回到首页&#xff0c;所以做了如下改动 1、在FormAuthenticationFilter中在issueSuccessRedirect中加上五句话。 Overrideprotected void issueSuccessRedirect(ServletRequest …...

Greenplum数据库执行器——PartitionSelector执行节点

为了能够对分区表有优异的处理能力&#xff0c;对于查询优化系统来说一个最基本的能力就是做分区裁剪partition pruning&#xff0c;将query中并不涉及的分区提前排除掉。如下执行计划所示&#xff0c;由于单表谓词在parititon key上&#xff0c;在优化期间即可确定哪些可以分区…...

POJ 2311 Cutting Game

POJ 2311 Cutting Game 题目大意 有一张有whw\times hwh个格子的长方形纸张&#xff0c;两个人轮流将当前的纸张中选一张&#xff0c;并沿着格子的边界将这张纸剪成两部分。最先切出只有一个格子的纸张&#xff08;111\times 111的纸张&#xff09;的玩家获胜。当双方都采用最…...

CTF-PHP反序列化漏洞1-基础知识

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。我的…...

【面试】记一次安恒面试及总结

文章目录SQL 注入sql注入的原理&#xff1f;如何通过SQL注入判断对方数据库类型&#xff1f;补充一下其他方法判断数据库类型时间盲注的函数XPath注入抓不到http/https包&#xff0c;怎么办&#xff1f;app无自己的ssl证书app有自己的ssl证书-证书绑定(SSL pinning)逻辑漏洞有哪…...

刹车制动(卡钳)TOP3供应商份额超50%,哪些本土供应商突围

作为中国本土底盘系统供应商最早切入的细分市场之一&#xff0c;乘用车&#xff08;液压&#xff09;刹车制动器&#xff08;含卡钳&#xff09;由连接到车轮的制动盘和位于制动盘边缘的卡钳组成。制动时&#xff0c;高压刹车油推动刹车片夹紧刹车盘&#xff0c;从而产生制动效…...

Go分布式爬虫笔记(二十二)

文章目录22 辅助任务管理&#xff1a;任务优先级、去重与失败处理设置爬虫最大深度避免请求重复设置优先队列设置随机User-Agent失败处理22 辅助任务管理&#xff1a;任务优先级、去重与失败处理 设置爬虫最大深度 目的: 防止访问陷入到死循环控制爬取的有效链接的数量 最大…...

跨线程修改主界面

winform 方式&#xff1a; public delegate void MyInvoke(string str1); private void check_Click(object sender, RoutedEventArgs e) { //跨现场调度1 delete委托 WIMFORM Task.Run(() > { …...

国内ChatGPt研发-中国chatGPT

人工智能软件chatGPT Chat GPT是一种自然语言处理算法&#xff0c;采用了深度学习技术&#xff0c;用于实现文本生成和自然语言处理任务。它可以实现自然而然的人机交互&#xff0c;在自然语言生成和问答领域应用广泛。 值得注意的是&#xff0c;Chat GPT本身并不是一款具体的…...

springboot的rest服务配置服务的根路径

如果不配置默认为空&#xff0c;如下是application.yml文件只配置了端口号 server:port: 6868 那么访问时直接访问服务即可 如果配置了rest服务 RestController RequestMapping("/netLicense") public class NetLicenseController {RequestMapping("/getLice…...

MySQL B+Tree 索引优化技巧

文章目录前言一、BTree索引的基本原理二、BTree索引的性能优化技巧1.索引列的选择2.索引列的顺序3.索引长度4.索引的覆盖性5. 索引的唯一性总结前言 MySQL是一种开源关系型数据库管理系统&#xff0c;被广泛应用于各种应用程序中。作为一种关系型数据库&#xff0c;MySQL使用B…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...