# 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.rhkb.cn/news/475103.html

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

相关文章

不能打开网页,但能打开QQ、微信(三种方式)

1.VPN错误 下面三个开关全关闭 2.DNS问题 WINR 输入CMD打开命令行 命令行输入 ipconfig/flushdns 重启电脑 3.直接火绒(一键修复)

Unity类银河战士恶魔城学习总结(P132 Merge skill tree with skill Manager 把技能树和冲刺技能相组合)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了解锁技能后才可以使用技能,先完成了冲刺技能的锁定解锁 Dash_Skill.cs using System.Collections; using System…

Linux-第2集-打包压缩 zip、tar WindowsLinux互传

欢迎来到Linux第2集,这一集我会非常详细的说明如何在Linux上进行打包压缩操作,以及解压解包 还有最最重要的压缩包的网络传输 毕竟打包压缩不是目的,把文件最终传到指定位置才是目的 由于打包压缩分开讲没有意义,并且它们俩本来…

mysql delete后通过日志恢复数据

1.打开navicat查看删除时间 2.查看日志功能是否打开 show variables like %log_bin%;3. 查看日志文件所在目录 show variables like %datadir%;4.用这个路径去找日志文件,名字里带bin,最后修改时间和你第一步找到删除时间一样(如果之后有过其它增删改…

鸿蒙NEXT开发-用户通知服务的封装和文件下载通知

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

C++——智能指针剖析

参考: 恋恋风辰官方博客 动态内存管理 - cppreference.com SRombauts/shared_ptr: 一个最小的 shared/unique_ptr 实现,用于处理 boost/std::shared/unique_ptr 不可用的情况。 C智能指针_c 智能指针-CSDN博客 当…

【java】java入门

盘符名称冒号---------盘符切换 dir---------------查看当前路径下的内容 cd目录--------进入单级目录 cd..----------回退到上一级目录 cd \----------回退到盘符目录 cls----------清屏 exit 为什么要配环境变量? 在任意的目录下都可以打开指定的软件。把软件的路…

11.19.2024刷华为OD

文章目录 HJ51HJ53 杨辉三角HJ56HJ57 高精度整数加法HJ58HJ60 简单题HJ63 DNA序列(简单题)语法知识记录 HJ51 https://www.nowcoder.com/practice/54404a78aec1435a81150f15f899417d?tpId37&tags&title&difficulty0&judgeStatus0&…

数据挖掘英语及概念

分类 classify 上涨或跌 回归 regression 描述具体数值 分类模型评估 1.混淆(误差)矩阵 confusion matrix 2.ROC曲线 receiver operating characteristic curve 接收者操作特征曲线 3.AUC面积 area under curve ROC曲线下与坐标轴围成的面积&#x…

GOLANG+VUE后台管理系统

1.截图 2.后端工程截图 3.前端工程截图

go-zero(三) 数据库操作

go-zero 数据库操作 在本篇文章中,我们将实现一个用户注册和登录的服务。我们将为此构建一个简单而高效的 API,包括请求参数和响应参数的定义。 一、Mysql连接 1. 创建数据库和表 在 MySQL 中创建名为 test_zero的数据库,并创建user 表 …

MFC图形函数学习09——画多边形函数

这里所说的多边形是指在同一平面中由多条边构成的封闭图形,强调封闭二字,否则无法进行颜色填充,多边形包括凸多边形和凹多边形。 一、绘制多边形函数 原型:BOOL Polygon(LPPOINT lpPoints,int nCount); 参数&#x…

【算法】回文数索引、回文子串输出、整数反转

目录 回文数索引 思路: 回文子串输出 思路 回文数索引 思路: 目标字母索引可能是一个或者是两个,返回任意的一个索引即可,如果已经是回文串则直接返回-1。 下面列出几种目标删除字母可能出现的位置: 我们可以先定…

MAC创建一个自动操作,启动系统【睡眠】功能,并将绑定快捷键

目的 通过 Automator 创建一个服务来启动系统【睡眠】这个功能,并绑定快捷键。 步骤一:创建 Automator 服务 打开 Automator: ○ 在 Spotlight 中搜索 Automator,然后打开。选择服务类型: ○ 在 Automator 的启动界…

ThinkPHP6门面(Facade)

门面 门面(Facade) 门面为容器中的(动态)类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩展性,你可以为任何的非静态类库定义一个facade类。 系统已经为大部分…

1436:数列分段II -整型二分

1436&#xff1a;数列分段II 题目来源&#xff1a;一本通 【输入样例】 5 3 4 2 4 5 1【输出样例】 6题意 将数列分成若干段&#xff0c;最多M段&#xff0c;求这些段中最大值中的最小值。&#xff08;M<N是M的约束&#xff09; 思路 最大最小问题考虑二分。由于M越大&…

Linux-第1集-基础指令 pwd、cd……入门

欢迎来到Linux操作系统的世界&#xff0c;本集我会用最简单的语言给大家讲解最基础的指令。 首先我们要明确Linux是通过指令完成相应的操作&#xff0c; 由于Linux的用户都是行内人&#xff0c;所有我们在学习此操作系统时看到的都是指令界面&#xff0c;而非像Windows操作系…

Golang | Leetcode Golang题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; func nearestPalindromic(n string) string {m : len(n)candidates : []int{int(math.Pow10(m-1)) - 1, int(math.Pow10(m)) 1}selfPrefix, _ : strconv.Atoi(n[:(m1)/2])for _, x : range []int{selfPrefix - 1, selfPrefix, selfPrefix …

【最新鸿蒙应用开发】——合理使用自定义弹框

自定义弹窗选型 合理选择不同的系统能力实现弹窗&#xff0c;有利于提升应用开发效率&#xff0c;实现更好的功能需求&#xff0c;因此了解自定义弹窗的选型和差异非常重要。在应用开发中&#xff0c;为了选择出合适的弹窗选型&#xff0c;从使用场景上&#xff0c;需要重点关…

044 商品详情(异步编排)

文章目录 销售属性分组规格参数异步编排application.ymlMyThreadConfig.javaThreadPoolConfigProperties.javaSkuInfoServiceImpl.java 销售属性 sku表&#xff1a;tb_sku_info sku对应销售属性表&#xff1a;tb_sku_sale_attr_value 结果 在详情页系统中&#xff0c;切换属…