Spring事务:事务的基础 以及使用

news2024/11/25 5:29:53

目录

GTP前言

一、关于事务

1.事务的四大特性ACID

2.脏读、不可重复读、幻读

① 脏读

② 不可重复读

③ 幻读

3.事务的隔离级别

4.事务的传播机制

① Propagation.REQUIRED 默认

② Propagation.SUPPORTS

③ Propagation.MANDATORY

④ Propagation.REQUIRES_NEW

⑤ Propagation.NOT_SUPPORTED

⑥ Propagation.NEVER

⑦ Propagation.NESTED

二、事务的两种实现

1.手动挡

2.自动挡

注意事项:



GTP前言

 什么是事务?

如何实现事务?

 


 

一、关于事务

1.事务的四大特性ACID

  • 原子性(Atomicity): 一个操作是不可中断的,要么全部执行成功要么全部执行失败
  • 一致性(Consistency): 事务执行的结果必须是使数据库从一个一致性状态 变到 另一个一致性状态。一致性与原子性是密切相关的
  • 隔离性(Isolation): 事务的执行不能被其他事务干扰
  • 永久性(Durability): 事务一旦提交,它对数据库中数据的改变就应该是永久性的

2.脏读、不可重复读、幻读

这是最常见的三种由于并发访问导致的数据读取问题

① 脏读

脏读是指一个事务读取了另一个事务尚未提交的数据。由于读取的数据可能随时会被回滚,因此读取的结果是不可靠的

② 不可重复读


简而言之就是 前后多次读取,数据内容不一致。是指在一个事务中,多次读取同一个数据时,由于其他事务修改了这个数据并提交了事务,导致读取结果不一致的现象。

③ 幻读

前后多次读取,数据总量不一致

3.事务的隔离级别

 

 

4.事务的传播机制

事务传播机制解决的是一个事务在多个节点(方法)中传递的问题

① Propagation.REQUIRED 默认

如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。

② Propagation.SUPPORTS

如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

 

③ Propagation.MANDATORY

如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常

④ Propagation.REQUIRES_NEW

创建一个新的事务,如果当前存在事务,则把当前事务挂起

⑤ Propagation.NOT_SUPPORTED

以非事务方式运行,如果当前存在事务,则把当前事务挂起。

⑥ Propagation.NEVER

以非事务方式运行,如果当前存在事务,则抛出异常。

⑦ Propagation.NESTED

如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 REQUIRED

 

 

二、事务的两种实现

1.手动挡

通过在代码中显式地开始、提交或回滚事务来实现事务管理。虽然这种方式灵活性较高,但是对代码的侵入性较大,而且容易产生大量的重复代码,所以会就行。

@Autowired
    private DataSourceTransactionManager transactionManager;
    @Autowired
    private TransactionDefinition transactionDefinition;

    public void add(User userInfo) {
        // 1.开始事务
        TransactionStatus transactionStatus =
                transactionManager.getTransaction(transactionDefinition);
        // 手动设置时间
        userInfo.setCreatetime(Timestamp.valueOf(LocalDateTime.now()));
        userInfo.setUpdatetime(Timestamp.valueOf(LocalDateTime.now()));
        int result = userService.add(userInfo);
        System.out.println("添加:" + result);
        // 2.回滚事务  
        // transactionManager.rollback(transactionStatus);
        // 2.提交事务
        transactionManager.commit(transactionStatus);
    }

2.自动挡

通过在配置文件或者注解中声明事务的属性,由Spring框架自动地管理事务。这种方式不需要在代码中显式地管理事务,因此代码的可读性和可维护性较高。

 

注意事项:

  • 问题:当出现try-catch的时候,即便程序发生异常,那么事务也不会发生自动回滚。
  • 原因:异常被 处理,事务检测不到
  • 解决方案:

 

总结

  • 什么是脏读、幻读、不可重复读
  • 在 Spring 项目中使用事务,用两种方法手动操作和声明式自动提交,其中后者使用的最多,在方法上添加 @Transactional 就可以实现
  • 事务的隔离级别,以及Spring中如何设置
  • 事务的传播机制,以及SPring中如何设置

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

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

相关文章

APK一键注入网络验证后台PHP源码ThinkPHP开发版

APK一键注入网络验证后台PHP源码ThinkPHP开发版 APK一键注入网络验证后台PHP源码ThinkPHP开发版 源码: https://url11.ctfile.com/d/25976711-55383299-827d49?p6724 (访问密码:6724) 修复 已去除登录提示到期问题。 功能简介 - 无注…

庄懂的TA笔记(十三)<特效-混合模式:四种主要透明通道用法 AC,AB,AD,自定义混合>

庄懂的TA笔记(十三)<特效-混合模式:四种主要透明通道用法 AC,AB,AD,自定义混合> 效果展示: 正文: 一、特效类大纲: 1、特效 透 2、特效 动 3、特效 映 二、特效:AC:透…

学习 Python 之 Pygame 开发魂斗罗(十三)

学习 Python 之 Pygame 开发魂斗罗(十三)继续编写魂斗罗1. 创建敌人2类2. 编写敌人2类的draw()函数3. 编写敌人越界消失函数4. 编写敌人开火函数5. 把敌人2加入地图进行测试继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(十…

英特尔CEO基辛格:开创可持续计算新时代

近日,帕特基辛格作为英特尔CEO后,第一次来华访问。在2023英特尔可持续发展高峰论坛上,笔者有幸聆听他的演讲。他严谨又不乏幽默地给我们分享了英特尔如何践行可持续发展的思考和举措。 基辛格表示,身处科技行业,我们不…

Jetson Nano驱动机器人的左右两路电机

基于Jetson Nano板子搭建一个无人车,少不了减速电机驱动轮子滚动,那如何驱动呢?从Jetson.GPIO库文件来说,里面没有支持产生PWM的引脚,也就意味着Jetson nano没有硬件产生PWM的能力,所以我们不得不使用别的方…

容器的崛起——Docker与K8s的相爱相杀

容器的崛起 对于K8s启用docker,作为普通开发者的体感是,k8s不就是docker的集群操作吗?k8s弃用docker就像鱼反对水一样不可思议,那么这两个技术究竟是什么关系,Kubernetes 是如何一步步与 Docker 解耦的,请…

k8s学习-CKS真题-Runtime设置gVisor

目录题目环境搭建解题参考题目 该 cluster 使用 containerd 作为 CRI 运行时。containerd 的默认运行时处理程序是 runc。 containerd 已准备好支持额外的运行时处理程序 runsc (gVisor)。 Task 使用名为 runsc 的现有运行时处理程序,创建一个名为 untrusted 的 Ru…

MIPI D-PHYv2.5笔记(20) -- High-Speed Data-Clock Timing

PHY是在Forward Direction中的源同步接口(source synchronous interface)。无论是处于Forward还是Reverse信号模式,只能有一个时钟源。在Reverve Direction中,时钟是在Forward Direction中被发送的。 图1 Conceptual D-PHY Data a…

本地目录映射到公网访问

1 环境搭建 1.1 nodejs安装 首先是安装nodejs,下载地址:https://nodejs.org/zh-cn/download 选择windows exe版本直接下载。 解压可以得到如下文件: 然后添加环境变量保证在任意终端可以直接使用命令。 当然也可以直接下载msi文件进行安装…

AD8226ARZ-R7-ASEMI代理亚德诺AD8226ARZ-R7车规级芯片

编辑-Z AD8226ARZ-R7芯片参数: 型号:AD8226ARZ-R7 输入电压噪声:22 nV/√Hz 输出电压噪声:120 nV/√Hz 电流噪声:100 fA/√Hz 输入偏移:200μV 输出偏移:1000μV 输入偏置电流&#xff…

得物 API一站式协作平台的一些思考

1.背景 Mooncake是得物API一站式协作平台。从2022年3月份开始负责Mooncake,到现在已经一年了,回顾这一年,Mooncake大的阶段上,总共经历过两个版本: 1、Mooncake 1.0: 面向前端和客户端的mock平台,主要解决接口调用者…

PHP实现以函数的方式计算阶乘,使用函数输入数值逆序输出的两个代码程序

目录 前言 一、实现以函数的方式计算阶乘 1.1运行流程(思想) 1.2代码段 1.3运行截图 二、使用函数输入3个数求和,并以表单形式输出 2.1运行流程(思想) 2.2代码段 2.3运行截图 前言 1.因多重原因,…

项目沟通管理流程的6大规范步骤

1、建立沟通计划 需要对整个项目的沟通对象、沟通内容、沟通频率、沟通方法等各方面,进行计划和安排。尤其需明确沟通机制,建立完整的沟通计划。并根据项目沟通的具体情况,实时添加和修订计划,以保证沟通管理计划的持续适用性。 项…

电脑重装了系统开不了机怎么办?

我们的电脑办公用久后也会出现故障问题,例如卡顿反应慢等等,这时候就要进行重装系统了,但是很多小伙伴重装系统后会出现开不了机的问题,其实我们比较常见的也就是电脑重装系统开不了机的情况。有很多小伙伴反映自己不知道应该怎么…

阿里架构师惨遭“人员优化”,离职只留下一份Java面试进阶手册!!

前几天,一个认识了好几年在大厂工作的程序员朋友,年近30了,却被大厂以“人员优化”的名义无情被辞,据他说,有一个月散伙饭都吃了好几顿…… 在很多企业,都有KPI考核,然后在此基础上还会弄个“末…

【java】深入分析try with resouce的原理 java如何通过方法句柄的方式进行方法调用

这个代码如果是复制用去,非常简单,但是推导过程真的特别艰辛,十几二十行的代码 博主和某T吵了一下午,到最后某T给的写法还是错误的,总之博主能写出这个demo实属不易。推荐看到本博客的同学自己再去深入学习相关的内容&…

用SQL语句操作Oracle数据库--数据查询详解(下篇)

数据查询是数据库的核心操作。上一篇文章我们介绍了单表查询操作,本文将继续介绍另一种重要的查询类型—[ 多表查询 ](涉及多个表的数据查询)。 本文我们将使用以下三个表来进行查询操作: TABLE1: S(学生基本信息表) TABLE2: C(…

Maven环境搭建及配置

文章目录一、系统要求二、安装步骤1.JDK检查2.下载Maven3.配置Maven环境变量4.检查配置一、系统要求 项目要求JDKMaven 3.3 要求 JDK 1.7或以上Maven 3.2 要求 JDK 1.6 或以上 Maven 3.0/3.1 要求 JDK 1.5 或以上磁盘Maven 自身安装需要大约 10 MB 空间。除此之外,…

​破除“内卷”,什么才是高阶智能座舱更优方案?

下一代智能座舱雏形已现。 从多屏互动到舱内全场景交互,从中控娱乐快速延伸到更多元化的车内娱乐平台;越来越多元化功能集中上车,座舱空间的营造(包括氛围灯、香氛等)以及AR技术的应用等等,开始深刻影响着…

活动目录密码策略管理

员工使用的密码可以决定或破坏组织中的数据安全性。但是,知道员工通常不遵循良好的密码卫生习惯也就不足为奇了。从在本机工具(如 Windows Active Directory 组策略)中设置弱密码和通用密码到宽松的密码策略规则,有几个因素对密码…