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

spring 事务隔离级别

一、理解 脏读、不可重复读和幻读

脏读、不可重复读和幻读是数据库事务处理中可能出现的三种并发问题,它们都与事务的隔离性有关。下面是这三种现象的简要说明:

1. 脏读(Dirty Read):

        当一个事务读取了另一个事务尚未提交的更改数据时,就会发生脏读。如果后者最终回滚了事务,那么前者读取的数据实际上是无效的,即“脏”的。脏读破坏了事务的隔离性,因为它允许一个事务查看到未确定的中间状态数据。

2. 不可重复读(Non-repeatable Read):

        不可重复读发生在同一个事务中,当用户对同一数据进行两次或更多次查询时,由于其他并发事务对数据进行了修改并提交,导致后一次查询的结果与前一次不同。换句话说,就是事务内部无法重复获取到之前读取过的相同数据,这违反了事务的一致性要求。

3. 幻读(Phantom Read):

        幻读通常涉及到插入或删除操作。在一个事务内,用户执行两次相同的查询,第二次查询时发现多出了原本不存在的记录(幻象记录),这是因为在两次查询之间,有其他事务插入了新的数据。或者,第一次查询时存在的某些记录,在第二次查询时因其他事务的删除操作而消失。幻读关注的是查询结果集中行的数量变化,而不是数据本身的变化。

为了解决这些问题,数据库管理系统提供了不同的事务隔离级别,包括READ UNCOMMITTED(允许所有上述问题)、READ COMMITTED(解决了脏读问题)、REPEATABLE READ(进一步解决了不可重复读问题)和SERIALIZABLE(最严格,解决了所有三种问题,但可能牺牲性能)。不同的应用场景可能会根据实际需求选择不同的隔离级别来平衡一致性和性能。

二、事务隔离级别

在Spring框架中,事务隔离是指在多个并发事务之间设置的边界,以防止它们相互影响,确保数据的一致性和完整性。Spring支持数据库系统定义的四种标准的事务隔离级别,以及一个默认级别。以下是这五种级别的概述:

1. Isolation.DEFAULT(默认):

        这是Spring特有的一个级别,它意味着事务的隔离级别将由底层数据库系统决定。每个数据库都有自己的默认隔离级别,例如MySQL的默认隔离级别是REPEATABLE_READ,而Oracle的默认级别是READ_COMMITTED。

2. Isolation.READ_UNCOMMITTED(读未提交):

        这是最宽松的隔离级别,允许脏读、不可重复读和幻读。在这种级别下,一个事务可以读取另一个未提交事务的数据。

3. Isolation.READ_COMMITTED(读已提交):

        防止了脏读,但允许不可重复读和幻读。在这个级别,一个事务只能看到其他事务已经提交的修改。

4. Isolation.REPEATABLE_READ(可重复读):

        防止了脏读和不可重复读,但允许幻读。在这个级别,一个事务在整个事务期间可以看到相同的数据多次,即使其他事务在这期间对数据进行了修改。

5. Isolation.SERIALIZABLE(序列化):

        这是最严格的隔离级别,它可以防止脏读、不可重复读和幻读。在序列化隔离级别下,事务如同按照顺序执行一样,但代价是性能降低,因为需要锁定所有读取的行。

在Spring中,你可以通过@Transactional注解来设置事务的隔离级别,例如:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void someServiceMethod() {// 事务内的代码
}

或者在XML配置中设置:

<tx:advice id="transactionAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="someServiceMethod" isolation="READ_COMMITTED" /></tx:attributes>
</tx:advice>

选择合适的隔离级别取决于你的应用程序的需求和性能考虑。通常,READ_COMMITTED是一个平衡性能和并发控制的常见选择,而SERIALIZABLE虽然最安全,但可能导致更多的锁竞争和死锁。

三、事务传播和事务隔离级别关联性:

1. 虽然两者是独立的概念,但它们共同确保了事务的正确性和一致性。事务传播定义了事务的边界和嵌套关系,而事务隔离级别则确保在这些边界内的数据一致性

2. 在实际应用中,根据业务需求和性能考虑,结合使用不同的事务传播行为和隔离级别。例如,对于需要确保数据一致性的关键操作,可能会选择较高的隔离级别,并使用PROPAGATION_REQUIRES_NEW来确保该操作在一个独立的事务中执行,不受外部事务影响。

相关文章:

  • [手游] 口袋妖怪肉鸽宝可梦肉鸽
  • 烧写uboot、linux镜像、根文件系统到开发板
  • 数据挖掘--引论
  • 基于zyyo主页与無名の主页合并二改,一款适合新手的个人主页
  • c++ 简单的日志类 CCLog
  • SpringMVC:拦截器(Interceptor)
  • Python | 排队取奶茶
  • 老旧机子装LINUX——xubuntu
  • 自制植物大战僵尸:HTML5与JavaScript实现的简单游戏
  • JavaScript入门宝典:核心知识全攻略(下)
  • RabbitMQ怎么保证可靠性
  • [C#]使用OpenCvSharp图像滤波中值滤波均值滤波高通滤波双边滤波锐化滤波自定义滤波
  • 国产操作系统上Vim的详解03--使用Vundle插件管理器来安装和使用插件 _ 统信 _ 麒麟 _ 中科方德
  • 数据结构与算法笔记:基础篇 - 散列表(下):为什么散列表和链表经常会一起使用?
  • linux flask | 接口保持在后台一直运行、python后端接口长期调用、python后台持续运行方法、python提供后端接口
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • Angular 2 DI - IoC DI - 1
  • download使用浅析
  • Git学习与使用心得(1)—— 初始化
  • Java 最常见的 200+ 面试题:面试必备
  • Javascript Math对象和Date对象常用方法详解
  • java中的hashCode
  • k8s 面向应用开发者的基础命令
  • leetcode-27. Remove Element
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Magento 1.x 中文订单打印乱码
  • PAT A1050
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python_网络编程
  • underscore源码剖析之整体架构
  • windows下如何用phpstorm同步测试服务器
  • Zepto.js源码学习之二
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 深度学习入门:10门免费线上课程推荐
  • 通信类
  • 我感觉这是史上最牛的防sql注入方法类
  • 优秀架构师必须掌握的架构思维
  • ionic异常记录
  • MyCAT水平分库
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • ${ }的特别功能
  • (+4)2.2UML建模图
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (PySpark)RDD实验实战——求商品销量排行
  • (Ruby)Ubuntu12.04安装Rails环境
  • (超详细)语音信号处理之特征提取
  • (二)测试工具
  • (二)原生js案例之数码时钟计时
  • (力扣题库)跳跃游戏II(c++)
  • (十)T检验-第一部分
  • (十八)SpringBoot之发送QQ邮件
  • (四)Controller接口控制器详解(三)
  • (算法)Game