前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >事物隔离级别

事物隔离级别

原创
作者头像
动力节点Java培训
修改于 2019-01-28 01:39:05
修改于 2019-01-28 01:39:05
1.2K0
举报
文章被收录于专栏:Java学习资料Java学习资料

事务隔离级别:

@Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用

@Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)

@Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)

@Transactional(isolation = Isolation.SERIALIZABLE):串行化

1.READ UNCIMMITTED(未提交读)

事务中的修改,即使没有提交,其他事务也可以看得到,比如说上面的两步这种现象就叫做脏读,这种隔离级别会引起很多问题,如无必要,不要随便使用

例子:还是售票系统,小明和小花是售票员,他们分别是两个不同窗口的员工,现在售票系统只剩下3张票,此时A来小华这里买3张票,B来小明买票,小华查到余票还有就给接了订单,就要执行第三步的时候,小明接到B的请求查询有没有余票。看到小华卖出了3张票,于是拒绝卖票。但是小华系统出了问题,第三步执行失败,数据库为保证原子性,数据进行了回滚,也就是说一张票都没卖出去。

总结:这就是事务还没提交,而别的事务可以看到他其中修改的数据的后果,也就是脏读。

2.READ COMMITTED(提交读)

大多数数据库系统的默认隔离级别是READ COMMITTED,这种隔离级别就是一个事务的开始,只能看到已经完成的事务的结果,正在执行的,是无法被其他事务看到的。这种级别会出现读取旧数据的现象

例子:还是小明小华销售员,余票3张,A来小华那里请求3张订票单,小华接受订单,要卖出3张票,上面的销售步骤执行中的时候,B也来小明那里买票,由于小华的销售事务执行到一半,小明事务没有看到小华的事务执行,读到的票数是3,准备接受订单的时候,小华的销售事务完成了,此时小明的系统变成显示0张票,小明刚想按下鼠标点击接受订单的手又连忙缩了回去。

总结:这就是小华的事务执行到一半,而小明看不到他执行的操作,所以看到的是旧数据,也就是无效的数据

3.REPEATABLE READ(可重复读)

REPEATABLE READ解决了脏读的问题,该级别保证了每行的记录的结果是一致的,也就是上面说的读了旧数据的问题,但是却无法解决另一个问题,幻行,顾名思义就是突然蹦出来的行数据。指的就是某个事务在读取某个范围的数据,但是另一个事务又向这个范围的数据去插入数据,导致多次读取的时候,数据的行数不一致。

例子:销售部门有规定,如果销售记录低于规定的值,要扣工资,此时经理在后端控制台查看了一下小明的销售记录,发现销售记录达不到规定的次数,心里暗喜,准备打印好销售清单,理直气壮和小明提出,没想到打印出来的时候发现销售清单里面销售数量增多了几条,刚刚好达到要求,气的经理撕了清单纸。原来是小明在就要打印的瞬间卖出了几张票,因此避过了减工资的血光之灾。

总结:虽然读取同一条数据可以保证一致性,但是却不能保证没有插入新的数据

4.SERIALIZABLE(可串行化)

SERIALIZABLE是最高的隔离级别,它通过强制事务串行执行(注意是串行),避免了前面的幻读情况,由于他大量加上锁,导致大量的请求超时,因此性能会比较底下,再特别需要数据一致性且并发量不需要那么大的时候才可能考虑这个隔离级别

脏读 :所谓的脏读,其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。

不可重复读 :不可重复读字面含义已经很明了了,比如事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。

幻读 :小的时候数手指,第一次数十10个,第二次数是11个,怎么回事?产生幻觉了?

幻读也是这样子,事务A首先根据条件索引得到10条数据,然后事务B改变了数据库一条数据,导致也符合事务A当时的搜索条件,这样事务A再次搜索发现有11条数据了,就产生了幻读。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
事务的隔离级别详解
多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
共饮一杯无
2022/11/28
4000
事务的隔离级别
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。可以通过 SELECT @@tx_isolation; 命令来查看:
happyJared
2019/08/12
6100
事务隔离级别总结
事务(Transaction)是数据库系统中一系列操作的一个逻辑单元,所有操作要么全部成功要么全部失
张申傲
2020/09/03
6980
Spring 的事务传播特性和隔离级别
PROPAGATION_REQUIRED:Spring的默认传播级别,如果上下文中存在事务则加入当前事务,如果不存在事务则新建事务执行。 PROPAGATION_SUPPORTS:如果上下文中存在事务则加入当前事务,如果没有事务则以非事务方式执行。 PROPAGATION_MANDATORY:该传播级别要求上下文中必须存在事务,否则抛出异常。 PROPAGATION_REQUIRES_NEW:该传播级别每次执行都会创建新事务,并同时将上下文中的事务挂起,执行完当前线程后再恢复上下文中事务。(子事务的执行结果不影响父事务的执行和回滚) PROPAGATION_NOT_SUPPORTED:当上下文中有事务则挂起当前事务,执行完当前逻辑后再恢复上下文事务。(降低事务大小,将非核心的执行逻辑包裹执行。) PROPAGATION_NEVER:该传播级别要求上下文中不能存在事务,否则抛出异常。 PROPAGATION_NESTED:嵌套事务,如果上下文中存在事务则嵌套执行,如果不存在则新建事务。(save point概念)
共饮一杯无
2022/11/28
4730
MySQL 的隔离级别
这是最低的隔离级别。在该级别下,一个事务可以看到其他事务尚未提交的数据。这意味着可能会读取到“脏读”(Dirty Reads)的数据,即未提交事务中的数据。
麦辣鸡腿堡
2025/03/18
1160
MySQL 事务特性和事务隔离级别
MySQL 事务具有四个特性:原子性、一致性、隔离性、持久性,这四个特性简称 ACID 特性
很酷的站长
2022/12/16
6640
MySQL 事务特性和事务隔离级别
详解MySQL隔离级别
在不同隔离级别下,事务A会有哪些不同的返回结果,也就是图中的V1、V2、V3的返回值分别是什么。
用户10384376
2023/02/26
9370
详解MySQL隔离级别
mysql事务隔离级别
1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
Java帮帮
2019/06/15
1.6K0
浅谈Spring的事务隔离级别与传播行为
Q:在一个批量任务执行的过程中,调用多个子任务时,如果有一些子任务发生异常,只是回滚那些出现异常的任务,而不是整个批量任务,请问在Spring中事务需要如何配置才能实现这一功能呢?
JAVA日知录
2019/10/19
1K0
隔离级别
隔离级别定义了一个事务可能受其他并发事务影响的程度。隔离级别的设置决定了数据库系统在并发环境下维持数据一致性的方式以及可能出现的问题(如脏读、不可重复读和幻读)。
程序员朱永胜
2023/11/07
2460
MySQL隔离级别
(1)打开一个客户端A,并设置当前事务模式为read uncommitted(未提交读),查询表account的初始值:
林老师带你学编程
2019/05/25
2K0
oracle事务隔离级别_mysql查看事务隔离级别
通常事务的隔离级别定义为以下4种(基于3种在并发事务中需要避免的现象来划分的):
全栈程序员站长
2022/11/04
1.9K0
锁是理解隔离级别的钥匙
说到数据库的隔离级别,我们好像都知道,但是好像又搞不清各种隔离级别之间真正的区别,以前我从网上看了很多文章,当时是觉得看懂了,但是没过多久又忘了,然后又要花大量的时间去重新理解。
zhanyd
2022/05/16
4930
锁是理解隔离级别的钥匙
MySQL之事务隔离级别
MySQL事务主要用于处理一个包含操作量比较大、复杂的业务。比如说,删除一个学生,我们除了要删除该学生的基本信息,同时也要删除考试记录、违规记录等。诸多的操作组成一个事务。事务是用来管理insert、update、delete基本指令的。当MySQL使用innodb引擎的前提下才支持事务操作。
AlicFeng
2019/03/08
8480
Mysql-3-事务隔离级别
https://mp.weixin.qq.com/s/iFmvvt4DJ-_qFeb0XUh6QA
Get
2024/03/10
1620
面试突击61:说一下MySQL事务隔离级别?
MySQL 事务隔离级别是为了解决并发事务互相干扰的问题的,MySQL 事务隔离级别总共有以下 4 种:
磊哥
2022/06/30
3020
面试突击61:说一下MySQL事务隔离级别?
虾皮一面:MySQL 事务的默认隔离级别是什么?可以解决幻读问题么?
你好,我是 Guide。分享一道群友面试虾皮遇到的 MySQL 事务相关的面试真题。
Guide哥
2022/05/25
7990
虾皮一面:MySQL 事务的默认隔离级别是什么?可以解决幻读问题么?
MySQL事务隔离级别浅析
事务开始后所有操作,要么全部做完,要么全部不做。事务是一个不可分割的整体。事务在执行过程中出错,会回滚到事务开始之前的状态,以此来保证事务的完整性。类似于原子在物理上的解释:指化学反应不可再分的基本微粒,原子在化学反应中不可分割 。
星哥玩云
2022/08/17
7750
MySQL事务隔离级别浅析
【面试题精讲】你知道MySQL中有哪些隔离级别吗
脏读(Dirty Read)是指一个事务读取到了另一个未提交事务的数据。假设事务A修改了某个数据,但还未提交,事务B读取到了这个未提交的数据,然后事务A回滚了,导致事务B读取到的数据是无效的或不一致的。脏读可能会导致数据的不一致性。
程序员朱永胜
2023/09/13
1370
事务隔离级别
  MySQL是一个 客户端/服务器 架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每 个客户端与服务器连接上之后,就可以称为一个会话( Session )。每个客户端都可以在自己的会话中 向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理 多个事务。事务有 隔离性 的特性,理论上在某个事务 对某个数据进行访问 时,其他事务应该进行 排 队 ,当该事务提交之后,其他事务才可以继续访问这个数据。但是这样对 性能影响太大 ,我们既想保持 事务的隔离性,又想让服务器在处理访问同一数据的多个事务时 性能尽量高些 ,那就看二者如何权衡取 舍了。
一个风轻云淡
2022/11/15
8340
事务隔离级别
相关推荐
事务的隔离级别详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档