MYSQL数据库事务的隔离级别(详解)
一、概述
数据库事务的隔离级别分为四种:(后面为解决的问题,结合下文案例深入理解)
1.读未提交(Read Uncommited)事务1修改的数据被事务2给回滚了
2.读已提交(Read Commited)事务1读到其他事务修改但是没有提交的信息
3.可重复读(Repeatable Read)在事务1进行多次的查询操作的时候,查询的结果不一致的
4.可串行化(Serializable)在同一事务中查询的时候发现多了很多条记录
二、隔离级别出现的原因
为了解决事务在并发执行的时候不会相互影响,所以就引入了事务的隔离级别(也就是在多个事务同时对一个数据进行读取、更新等操作的时候,如何保证数据的正确性和一致性)
三、四种事务隔离级别各自解决的问题
脏写 | 脏读 | 不可重复读 | 幻读 | |
读未提交 | √ | × | × | × |
读已提交 | √ | √ | × | × |
可重复读 | √ | √ | √ | × |
可串行化 | √ | √ | √ | √ |
四、不同的隔离级别解决的问题
- 脏写(事务1修改的数据被事务2给回滚了)
事务1 | 事务2 | |
T1 | begin | |
T2 | begin | |
T3 | update xxx set password= 200 where id = 1 | |
T4 | update xxx set password= 1000 where id = 1 | |
T5 | commit | |
T6 | Rollback |
这里可以看到事务1在修改完id为1的password并进行事务的提交之后,事务2在T6时刻进行了事务的回滚,这就导致了事务1对数据的修改丢失了,这是一个非常严重的错误,即自己修改的数据被被人给回滚了,在任何隔离级别的情况下都是解决了脏写问题。
- 脏读(事务1读到其他事务修改但是没有提交的信息、临时信息)
事务1 | 事务2 | |
T1 | begin | |
T2 | begin | |
T3 | update xxx set password= 99 where id = 1 | |
T4 | select password from xxx where id = 1 | |
T5 | commit | |
T6 | RollBack |
这里事务1在T4读取到了事务2针对id=1的用户的password修改,但是实际上事务2在最后进行了事务的回滚,这就导致了实际上事务1读到的是一个不存在的数据,也就是事务1读到了其他事务修改但是没有提提交的记录信息。在读已提交的隔离级别下就解决了脏读问题。
- 不可重复读(在同一事务进行多次的查询操作的时候,查询的结果是不一致的)
事务1 | 事务2 | |
T1 | begin | |
T2 | begin | |
T3 | select password from xxx where id = 1 | |
T4 | update xxx set password = 99 where id = 1 | |
T5 | select password from xxx where id = 1 | |
T6 | update xxx set password= 88 where id = 1 | |
T7 | select password from xxx where id = 1 | |
T8 | update xxx set password= 88 where id = 1 | |
T9 | commit | |
T10 | commit |
在T3、T5、T7时刻事务1对id=1的账号进行password,发现该数据一致是变化的,这就是不可重复读的问题,在同一事务中每次进行查询的时候数据都是在变化的,在可重复读的隔离级别下解决了不可重复的的问题。
- 幻读(在同一事务中查询的时候发现多了很多条记录,称为幻影记录)
事务1 | 事务2 | |
T1 | begin | |
T2 | begin | |
T3 | select * from xxx where id > 100 | |
T4 | insert into xxx(id,password) values (199,11) | |
T5 | select * from xxx where id > 100 | |
T6 | insert into xxx(id,password) values (200,11) | |
T7 | select * from xxx where id > 100 | |
T8 | insert into xxx(id,password) values (201,11) | |
T9 | commit | |
T10 | commit |
在T3、T5、T7时刻事务1对id大于100的信息进行查询的时候,发现在同一事务中每次查询的时候都会有新的数据的出现,这就是幻读问题,在可串行化(序列化)的隔离级别下解决了幻读的问题
五、混淆点&知识点
- 多次查询的的时候发现数据变少了,是幻读还是不可重复读
答:不可重复读。幻读一定是数据增多了(可以从字面意思上理解,幻读即出现幻影记录,那么就是两次读发现多了数据),如果是数据减少了,那么就是不可重复读
- 脏写和脏读的回滚问题
两者都是由于事务1在进行操作的时候其他事务回滚导致的问题,脏写是其他事务回滚导致自己写入的数据无效了,脏读则表示的是其他事务回滚导致读到的是无效的数据,由于脏写是所有事务隔离级别都解决的,所以做了解即可(一般通过加锁就可以解决)
- 四种隔离级别的问题严重性
问题严重性:脏写>脏读>不可重复读>幻读
- 在MYSQL中的事务隔离级别
在MySQL中innodb存储引擎下的隔离级别是可重复读,但是得益于innodb的MVCC版本控制,MYSQL在可重复读的隔离级别下同时解决了幻读的问题
六、四种隔离级别的比较总结
- 并发性
从字面意思上即可理解:
1.可串行化并发能力最低,所有的事务等待执行,解决所有问题,安全性高,但是效率低下
2.之后并发能力一次递增:串行化<可重复读<读已提交<读未提交
3.在实际的开发中根据业务的具体需求,权衡并发性和数据安全性选择对应的隔离级别
MYSQL数据库事务的隔离级别(详解)相关推荐
- MySQL事务及隔离级别详解
MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...
- 数据库事务的四大特性以及事务的隔离级别详解
作者 : fjdingsd 来源 : 博客园 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ ...
- 数据库并发机制和事务的隔离级别详解
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/64444896冷血之心的博客) 本文将从以下4个方面来展开: (1) ...
- SQL Server-聚焦事务、隔离级别详解(二十九)
前言 事务一直以来是我最薄弱的环节,也是我打算重新学习SQL Server的出发点,关于SQL Server中事务将分为几节来进行阐述,Always to review the basics. 事务简 ...
- 5、MySQL事务隔离级别详解
事务的隔离性就是指当多个事务同时运行时,各事务之间相互隔离,不可互相干扰.如果事务没有隔离性,就容易出现脏读.不可重复读和幻读等情况. 为了保证并发时操作数据的正确性,数据库都会有事务隔离级别的概念. ...
- SQL Server事务隔离级别详解
SQL Server事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用 ...
- Python进阶篇:MySQL隔离级别详解
前言 数据库并发的对同一批数据进行增删改,就可能会出现我们所说的脏写.脏读.不可重复读.幻读等一系列问题.MySQL提供了一系列机制来解决事务并发问题,比如事务隔离.锁机制.MVCC多版本并发控制机制 ...
- mysql数据 锁 隔离级别_MySQL数据库事务各隔离级别加锁情况--read uncommitted篇
1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解. 2.数据库事务的隔离级别只是了解,并没有深刻理解,也没有在实际工作中体验使用过. 3.经常面试被人问起数据库加锁情况,一 ...
- 「DB」数据库事务的隔离级别
2019独角兽企业重金招聘Python工程师标准>>> 数据库事务的隔离级别 讲事务的隔离级别之前,先来介绍一下数据库事务的几个特性: (1)原子性 最基本的特性,意思是在一个事务内 ...
最新文章
- matplotlib 散点图和折线图画在一起_使用matplotlib.pyplot画折线图
- PHP Shell生成工具Weevely
- 8266串口调试助手_开源软件分享-基于WPF的串口调试工具
- 微软启动了自爆程序,让我们一起帮它倒计时
- excel 图片转url_最全总结 | 聊聊 Python 办公自动化之 Excel(下)
- 一次性从linux发送多个文件到windows
- 三星Galaxy S21系列通过认证:终究还是要学苹果“保护环境”?
- [ActiveRecord]之 CRUD
- linux ulipad,Python for Ulipad(总结ulipad使用)
- STM32移植FATFS+USB+FLASH+PDFLIB库总结
- 爱荷华州立大学计算机学院,享誉全美的祖父级大学——爱荷华州立大学(ISU)...
- 深度学习中的batch、epoch、iteration
- 模电_数电_微机接口_微机应用实验装置,QY-MS535F
- KITTI数据集详解和评价标准
- md500代码,异步电机,基于28379D,带无速度传感器控制,参数辨识,同步调制等功能
- php动画效果,动画效果总结
- 基于Spring Security 的Java SaaS应用的权限管理
- [RK3568 Android11] 教程之使用RKDevInfoWriteTool工具烧录SN和MAC地址等
- 在线YAML转JSON工具
- css浅紫色,一款淡紫色纯CSS实现的开关/单选和复选组件
热门文章
- 如何学习 Objective-C 语言,这方面最好的书有什么?
- DolphinScheduler 2.0.5详解
- 抓取蜂鸟网游记并且制作成PDF文档
- 仿美团城市定位于城市选择
- 苹果4s忘记id密码怎么办_大哭!iPhone手机ID密码忘记了怎么办?3种方法轻松解决问题...
- 云存储及分布式创新应用笔记一
- 机器人搬运礼盒程序_安川搬运机器人搬运程序设置步骤介绍--安川机器人
- YYCache 源码解析(一):使用方法,架构与内存缓存的设计
- Mac Nginx 配置文件使用(nginx.conf,包含M系列)
- java案例大象和鹦鹉_世界十大最聪明动物 大象的“高智商”惹不起【图】