# Spring事务

Spring事务

什么是spring的事务?

在Spring框架中,事务管理是一种控制数据库操作执行边界的技术,确保一系列操作要么全部成功,要么全部失败,从而维护数据的一致性和完整性。Spring的事务管理主要关注以下几点:

  • 原子性(Atomicity):
    事务中的所有操作被视为一个不可分割的工作单元,如果其中任何一个操作失败,那么整个事务都会被撤销。
  • 一致性(Consistency):
    事务开始前和结束后,数据都必须保持一致状态。这意味着事务的执行不会破坏任何约束或业务规则。
  • 隔离性(Isolation):
    多个并发事务之间不会相互影响,每个事务都像是在独立的环境中运行,以防止脏读、不可重复读和幻读等问题。
  • 持久性(Durability):
    一旦事务完成并提交,它对数据库所做的更改就是永久的,即使系统崩溃,这些更改也不会丢失。

Spring支持两种类型的事务管理

  • 编程式事务管理:通过在代码中显式地调用TransactionTemplate或PlatformTransactionManager接口来管理事务,这种方式提供了更细粒度的控制,但会使代码变得复杂且不易维护。
  • 声明式事务管理:通过使用@Transactional注解或配置XML的方式在方法或类级别声明事务属性,这种方式更简洁,易于理解和维护,是Spring推荐的事务管理方式。

Spring的事务管理器(如DataSourceTransactionManager或JpaTransactionManager)与底层的数据源或持久层框架集成,提供了一致的事务抽象,使得开发人员可以专注于业务逻辑而不用关心具体的事务处理细节。

spring事务的传播机制有哪些?

Spring的事务传播机制定义了多个包含了事务的方法在相互调用时,事务是如何在这些方法间进行传递的。它确保了一个事务在多个调用方法间的可控性和稳定性。Spring事务传播机制包含以下七种类型:

  1. Propagation.REQUIRED(默认)
  • 描述:默认的事务传播级别。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • 适用场景:适用于大多数业务场景,确保业务操作要么全部成功,要么全部失败。
  1. Propagation.SUPPORTS
  • 描述:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • 适用场景:适用于非必须依赖事务的查询操作,或者不确定是否会有事务存在的情况。
  1. Propagation.MANDATORY
  • 描述:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • 适用场景:适用于那些必须运行在事务中的方法,确保事务的强制存在。
  1. Propagation.REQUIRES_NEW
  • 描述:表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。即无论外部是否开启事务,REQUIRES_NEW修饰的方法都会新开启自己的事务,且开启的事务之间相互独立,互不干扰。
  • 适用场景:适用于需要完全隔离的业务操作,确保不受外部事务影响。
  1. Propagation.NOT_SUPPORTED
  • 描述:以非事务的方式运行,如果当前存在事务,则把当前事务挂起。
  • 适用场景:适用于那些不需要事务支持的操作,如只读查询或更新操作不需要事务控制。
  1. Propagation.NEVER
  • 描述:以非事务的方式运行,如果当前存在事务,则抛出异常。
  • 适用场景:确保方法不会运行在事务环境中,避免事务对方法执行的影响。
  1. Propagation.NESTED
  • 描述:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于Propagation.REQUIRED。
  • 适用场景:适用于需要部分回滚而又不影响外部事务的场景,嵌套事务可以在内部进行回滚,而不影响外部事务。

Spring事务传播机制通过这七种类型,提供了灵活的事务控制策略,以满足不同业务场景的需求。在实际应用中,可以根据业务的具体要求选择适当的事务传播级别,以确保数据的一致性和完整性。

spring事务的隔离级别

Spring的隔离级别是解决多个事务同时调用数据库时,如何控制事务之间的可见性和数据一致性的重要机制。Spring框架提供了五种事务隔离级别,这些级别与数据库的事务隔离级别紧密相关,但由Spring框架进行配置和管理。以下是Spring的五种事务隔离级别的详细解释:

  1. ISOLATION_DEFAULT(DEFAULT)
  • 描述:这是PlatformTransactionManager的默认隔离级别,它使用连接的数据库默认的事务隔离级别。如果数据库默认隔离级别是READ COMMITTED,那么Spring事务的默认隔离级别也是READ COMMITTED。
  • 特点:依赖数据库的具体实现,不提供额外的事务隔离保证。
  1. ISOLATION_READ_UNCOMMITTED(READ UNCOMMITTED)
  • 描述:这是事务最低的隔离级别,允许一个事务读取另一个事务未提交的数据。
  • 问题:这种隔离级别容易产生脏读、不可重复读和幻读问题。脏读是指读取到未提交的数据,这些数据可能在后续被回滚,导致读取到的数据是无效的。
  1. ISOLATION_READ_COMMITTED(READ COMMITTED)
  • 描述:保证一个事务只能读取到已经提交的数据,不能读取未提交的数据。
  • 解决问题:解决了脏读问题,因为一个事务无法读取到另一个事务未提交的数据。
  • 遗留问题:但仍然存在不可重复读和幻读问题。不可重复读是指在一个事务内,多次读取同一数据,由于其他事务的修改,导致读取结果不一致。
  1. ISOLATION_REPEATABLE_READ(REPEATABLE READ)
  • 描述:这种事务隔离级别可以防止脏读和不可重复读问题。它确保了一个事务多次读取同一数据时,得到的结果是一致的。
  • 解决问题:通过锁定读取的数据行,防止其他事务修改这些数据,从而避免不可重复读问题。
  • 遗留问题:但仍然存在幻读问题。幻读是指当事务重新读取一个范围的记录时,由于其他事务插入了新的记录,导致读取结果集不一致。
  1. ISOLATION_SERIALIZABLE(SERIALIZABLE)
  • 描述:这是最高的隔离级别,事务被串行化执行,即事务只能一个接一个地执行,不能并发执行。
  • 解决问题:解决了脏读、不可重复读和幻读所有问题。
  • 缺点:性能开销大,因为事务必须串行执行,无法利用数据库的并发能力。

Spring的事务隔离级别通过控制事务之间的可见性和数据一致性,确保了数据库操作的正确性和可靠性。在选择隔离级别时,需要根据实际业务需求和数据一致性要求来权衡。通常,默认的隔离级别(ISOLATION_DEFAULT)或READ COMMITTED已经足够满足大多数业务需求,但在需要更高数据一致性要求的场景下,可能需要选择更高的隔离级别。然而,需要注意的是,隔离级别越高,性能开销也越大,因此需要在数据一致性和性能之间做出合理的选择。

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

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

相关文章

Jenkins更换主题颜色+登录页面LOGO图片

默认主题和logo图片展示 默认主题黑色和白色。 默认LOGO图片 安装插件 Login ThemeMaterial Theme 系统管理–>插件管理–>Available plugins 搜不到Login Theme是因为我提前装好了 没有外网的可以参考这篇离线安装插件 验证插件并修改主题颜色 系统管理–>A…

LLM文档对话 —— pdf解析关键问题

一、为什么需要进行pdf解析? 最近在探索ChatPDF和ChatDoc等方案的思路,也就是用LLM实现文档助手。在此记录一些难题和解决方案,首先讲解主要思想,其次以问题回答的形式展开。 二、为什么需要对pdf进行解析? 当利用L…

【虚幻引擎】UE5数字人开发实战教程

本套课程将会交大家如何去开发属于自己的数字人,包含大模型接入,流式输出,语音识别,语音合成,口型驱动,动画蓝图,语音唤醒等功能。 课程介绍视频如下: 【虚幻引擎】UE5 历时一个多月…

上位机编程命名规范

1.大小写规范 文件名全部小写是一种广泛使用的命名约定,特别是在跨平台开发和开源项目中。主要原因涉及技术约束、可读性和一致性等方面。以下是原因和优劣势的详细分析: 1. 避免跨平台问题 不同操作系统对文件名的大小写处理方式不同: Li…

JAVA:探索 PDF 文字提取的技术指南

1、简述 随着信息化的发展,PDF 文档成为了信息传播的重要媒介。在许多应用场景下,如数据迁移、内容分析和信息检索,我们需要从 PDF 文件中提取文字内容。JAVA提供了多种库来处理 PDF 文件,其中 PDFBox 和 iText 是最常用的两个。…

form表单的使用

模板 <template><el-form :model"formData" ref"form1Ref" :rules"rules"><el-form-item label"手机号" prop"tel"><el-input v-model"formData.tel" /></el-form-item><el-f…

【priority_queue的使用及模拟实现】—— 我与C++的不解之缘(十六)

前言 ​ priority_queue&#xff0c;翻译过来就是优先级队列&#xff0c;但是它其实是我们的堆结构&#xff08;如果堆一些遗忘的可以看一下前面的文章复习一下【数据结构】二叉树——顺序结构——堆及其实现_二叉树顺序结构-CSDN博客&#xff09;&#xff0c;本篇文章就来使用…

php 与 thinkphp 13 张 表 关联 查询,a.pry_key=b.pry_key and c.pry_key= b.pry_key 代码示例

在 PHP 中&#xff0c;假设你有 13 张表并且这些表之间通过 pry_key 关联&#xff0c;你可以使用 SQL 的 JOIN 来将这些表连接在一起&#xff0c;然后通过 PHP 执行该查询。以下是一个简化的示例&#xff0c;展示如何通过 JOIN 语句将 13 张表联接&#xff0c;并使用 PHP 代码执…

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意&#xff0c;我们使用的是Mac&#xff0c;所以ios pack并不能使用。 如何嫌官网上下载比较慢的话&#xff0c;可以考虑在csdn网站上下载&#xff0c;应该也是可以找到的。 2、cmake的下载 官网的链接&…

Kibana 本地安装使用

一 Kibana简介 1.1 Kibana 是一种数据可视化工具&#xff0c;通常需要结合Elasticsearch使用&#xff1a; Elasticsearch 是一个实时分布式搜索和分析引擎。 Logstash 为用户提供数据采集、转换、优化和输出的能力。 Kibana 是一种数据可视化工具&#xff0c;为 Elasticsear…

#Js篇:JSON.stringify 和 JSON.parse用法和传参

JSON.stringify 和 JSON.parse 1. JSON.stringify JSON.stringify 方法将一个 JavaScript 对象或数组转换为 JSON 字符串。 基本用法 const obj { name: "Alice", age: 25 }; const jsonString JSON.stringify(obj); console.log(jsonString); // 输出: {"…

基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)

#1024程序员节&#xff5c;征文# 博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老…

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构

Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…

android 使用MediaPlayer实现音乐播放--获取音乐数据

前面已经添加了权限&#xff0c;有权限后可以去数据库读取音乐文件&#xff0c;一般可以获取全部音乐、专辑、歌手、流派等。 1. 获取全部音乐数据 class MusicHelper {companion object {SuppressLint("Range")fun getMusic(context: Context): MutableList<Mu…

Android kotlin之配置kapt编译器插件

配置项目目录下的gradle/libs.versions.toml文件&#xff0c;添加kapt配置项&#xff1a; 在模块目录下build.gradle.kt中增加 plugins {alias(libs.plugins.android.application)alias(libs.plugins.jetbrains.kotlin.android)// 增加该行alias(libs.plugins.jetbrains.kotl…

【FAQ】HarmonyOS SDK 闭源开放能力 —Share Kit

1.问题描述&#xff1a; 使用系统分享组件分享本地文件&#xff0c;点击分享菜单下方的“另存为” 将要分享的文件分享至系统文件管理中&#xff0c;在文件管理中查看分享进来的文件为0B。尝试了3种uri的写法都不行&#xff0c;代码如下&#xff1a; const uri getContext()…

音视频入门基础:MPEG2-TS专题(7)——FFmpeg源码中,读取出一个transport packet数据的实现

一、引言 从《音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;3&#xff09;——TS Header简介》可以知道&#xff0c;TS格式有三种&#xff1a;分别为transport packet长度固定为188、192和204字节。而FFmpeg源码中是通过read_packet函数从一段MPEG2-TS传输流/TS文件中读…

HarmonyOs DevEco Studio小技巧31--卡片的生命周期与卡片的开发

Form Kit简介 Form Kit&#xff08;卡片开发服务&#xff09;提供一种界面展示形式&#xff0c;可以将应用的重要信息或操作前置到服务卡片&#xff08;以下简称“卡片”&#xff09;&#xff0c;以达到服务直达、减少跳转层级的体验效果。卡片常用于嵌入到其他应用&#xff0…

《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》

在当今数字化时代&#xff0c;图形界面程序的性能至关重要。使用 C20 开发图形界面程序时&#xff0c;优化界面响应速度和图形渲染效率是我们必须关注的焦点&#xff0c;这直接影响用户体验和程序的实用性。 一、理解界面响应速度和图形渲染效率的重要性 对于图形界面程序&am…

Spring Boot应用开发实战:构建高效、可维护的Web应用

Spring Boot应用开发实战:构建高效、可维护的Web应用 在当今快速迭代的软件开发环境中,Spring Boot凭借其“约定优于配置”的理念,迅速成为Java开发者构建微服务及Web应用的首选框架。它不仅简化了Spring应用的初始搭建以及开发过程,还通过自动配置、嵌入式服务器等特性,…