数据库基础知识点-事务隔离级别区分(读未提交、读已提交和可重复读)
事务隔离级别
数据库事务隔离级别分4个:
- 读未提交-Read uncommitted
- 读已提交-Read committed
- 可重复读-Repeatable read–MySQL
- 序列化-Serializable
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
序列化 | × | × | × |
越高的隔离,效率越差
1.读未提交-Read uncommitted详解
1.1 DEFAULT默认隔离级别,由数据库的数据隔离级别确认隔离级别
1.2 READ_UNCOMMITTED 都未提交的 级别最低
允许别的事务,去读取这个事务为提交之前的数据
缺点:可能会造成脏读、幻读、不可重复读。
1.3 例子讲解:
公司发工资了,领导把5000元打到singo的账号上,但是该事务并未提交,而singo正好去查看账户,发现工资已经到账,是5000元整,非常高兴。可是不幸的是,领导发现发给singo的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后singo实际的工资只有2000元,singo空欢喜一场。
出现上述情况,即我们所说的脏读,两个并发的事务,“事务A:领导给singo发工资”、“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。
可理解为:老板更改工资的事务拉长执行,你读了别人正在处理的数据。
2. 读已提交-Read committed
2.1 缺点:两次读的都是真的(不会出现脏读)可是却存在不可重复
2.2 例子讲解:
singo拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆也正好在网上转账,把singo工资卡的2000元转到另一账户,并在singo之前提交了事务,当singo扣款时,系统检查到singo的工资卡已经没有钱,扣款失败,singo十分纳闷,明明卡里有钱,为何…
出现上述情况,即我们所说的不可重复读,两个并发的事务,“事务A:singo消费”、“事务B:singo的老婆网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读。
大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。
可以理解为: 你两次查询为一次事务,将此事务拉长
3.可重复读-Repeatable read
3.1 即该事务执行期间,不允许其他事务对该事务数据进行操作,保证该事物中多次对数据的查询结果一致
3.2 缺点:会出现幻读
3.3 例子讲解:
当隔离级别设置为Repeatable read时,可以避免不可重复读。当singo拿着工资卡去消费时,一旦系统开始读取工资卡信息(即事务开始),singo的老婆就不可能对该记录进行修改,也就是singo的老婆不能在此时转账。
虽然Repeatable read避免了不可重复读,但还有可能出现幻读。
singo的老婆工作在银行部门,她时常通过银行内部系统查看singo的信用卡消费记录。有一天,她正在查询到singo当月信用卡的总消费金额(select sum(amount) from transaction where month = 本月)为80元,而singo此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction … ),并提交了事务,随后singo的老婆将singo当月信用卡消费的明细打印到A4纸上,却发现消费总额为1080元,singo的老婆很诧异,以为出现了幻觉,幻读就这样产生了。
注:MySQL的默认隔离级别就是Repeatable read。
4.序列化-Serializable
4.1: 就是上面的可重复读(REPEATABLE_READ)是将使用的数据范围锁起来不让别人用,而这里是将涉及数据的表全都锁起来,不允许别人操作。
这个事务的执行中,别的事务连在旁边看的机会都没有,完全不会有影响,你读的时候别人看不到,隔离开,单独执行。
整个事务排队执行
4.2: 缺点:效率低
参考博客:郑光宗的个人博客
数据库基础知识点-事务隔离级别区分(读未提交、读已提交和可重复读)相关推荐
- mysql 事务隔离规范_MySQL事务隔离级别以及脏读、幻读、不可重复读示例
事务的隔离性 MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session).每个客户端都可以在自己的 ...
- 数据库四种事务隔离级别详解
四种数据库隔离级别及解决的数据问题如下所示: 1.READ-UNCOMMITTED(读取未提交内容) 由于在该隔离级别下即使事务未提交所做的修改也会对其他事务产生影响.所以该级别会出现数据脏读的发生. ...
- mysql服务器级别角色_服务器数据库系列 - MySQL事务隔离级别详解
作者:xm_king SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. Read Un ...
- MySQL事务隔离级别以及脏读、幻读、不可重复读示例
事务的隔离性 MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session).每个客户端都可以在自己的 ...
- Mysql在可重复读事务隔离级别下怎么解决幻读的
目录 前言 并发事务产生的问题 更新丢失 回滚丢失 覆盖丢失 脏读 不可重复读 幻读 快照读和当前读 幻读验证 快照读如何避免幻读 当前读如何避免幻读 可重复读隔离级别发生幻读情况 小结 前言 Mys ...
- 【数据库】事务隔离级别
事务隔离级别 为了更好地说明事务隔离级别,请先移步快速理解脏读.不可重复读.幻读 有四种隔离级别,分别是读未提交(Read uncommitted),读已提交(Read committed),可重复读 ...
- Spring 的事务隔离级别和传播特性
2019独角兽企业重金招聘Python工程师标准>>> 今天被人问了一个Oracle 关于事务的简单问题,结果自己一时间竟然说错了 死了死了的,只能说自己没有用心去理解这个问题. ...
- 事务,Oracle,MySQL及Spring事务隔离级别
一.什么是事务: 事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种): 原子性 (atomicity):强调事务的不可分割: 一致性 (consi ...
- Spring五个事务隔离级别和七个事务传播行为
Spring五个事务隔离级别和七个事务传播行为 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数 ...
最新文章
- 用@Data注解的形式替代类中的setter、getter方法
- 网页标准HTML5标准较量正酣
- matlab的compass怎么用,Compass用法指南
- NOVO Nordisk IT SOP List
- Lambda省略格式Lambda使用前提
- PageRank 算法
- 流水线合成材料依赖表的生成算法
- Android Error:Could not find lottie.jar
- java代码安全检测机制,Java语言有多种实现的机制,下列( )技术不属于代码安全检测。...
- P2P端口映射 UPnP功能和使用详解
- 浅谈javascript的运行机制
- 微信支付之H5页面WAP端接入
- java 请求webservice_JAVA调用WebService实例
- windows10双系统删除linux,双系统删除教程详解:Windows(linux)双系统,教你如何删除其中一个!...
- pdf文件旋转后怎么完整保存
- java规则计算_亲属计算规则算法--java实现(关键算法摘要)
- springboot集成微信和QQ第三方登录
- linux signal11,Linux Signal
- 还在纠结芯片引脚需要加多大容值的电容吗?
- AT4352 [ARC101C] Ribbons on Tree