前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql-3-事务隔离级别

Mysql-3-事务隔离级别

原创
作者头像
Get
发布2024-03-10 21:01:52
1500
发布2024-03-10 21:01:52

4种隔离级别详解:MySQL-InnoDB-默认隔离级别为可重复读(RR)。

https://mp.weixin.qq.com/s/iFmvvt4DJ-_qFeb0XUh6QA

事务并发执行时,不考虑事务的隔离性,会产生数据不一致情况,为了解决数据不一致问题,就采用锁机制。

代码语言:java
复制
详解:
1、读未提交:"指一个事务还没提交时,它做的变更就能被其他事务看到",会产生脏读、幻读、不可重复读。
            所有事务都可以看到其他未提交事务的执行结果
			   比如同一时间有两个事物,一个正在修改,一个正在查询,查询的可以查看到正在修改的数据。若修改事物回滚,则查询的结果就是错误的。
2、读已提交:"指一个事务提交之后,它做的变更才能被其他事务看到",会产生幻读、不可重复读。
           一个事物只能看见其他已经提交的事物所做的改变
           两个并发的事务,“事务1:小明消费”、“事务2:小红网上转账”,事务1事先读取了数据,事务2紧接了更新了数据,并提交了事务,
           而事务1再次读取该数据时,数据已经发生了改变。
3、可重复读:"指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的",会产生幻读。
            若同一事物修改数据,会产生两次读取数据结果不一致问题。
            当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时会读取到包括刚插入的数据。
            如小红查小明信用卡消费金额为50元,而小明此时正好买东西花了1000元,随后小红将小明当月的信用卡消费明细打印出来,却发现消费总额为1050元,
            小红很诧异,以为是出现了幻觉。
4、串行化:"会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行"
		    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决不读脏,可重复读,不可幻读。
			简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争,并发性能最差,在分布式事务中可能会被用到


1、脏读:"是指一个事务能读取其他事务未提交的数据"
2、不可重复读:"同一事务先后读取同一条数据,但前后两次读到的数据是不一致的。(强调update 针对单行)"
              一个事务在前后两次读取某个数据时,发现前后两次读到的数据是不一致的(数据发生了修改),这种现象叫做“不可重复读”。 
3、幻读:"同一事务先后读取一个范围的记录,但两次读取的纪录数不同。(强调insert或delete,范围查询)"
        指的是在一个事务执行过程中,读取到了其他事务新插入数据,导致两次读取的结果不一致 。
        一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读” 。
4、丢失更新:"撤销一个事务时,把其他事务已提交的更新数据覆盖"
    	   (事务A和B并发执行事物,A事务执行更新后,提交;B事务在A事务更新后,B事务结束前也做了对该行数据的更新操作,然后回滚,则两次更新操作都丢失了)
"不可重复读和幻读的区别:可重复读是读到的是其他事务修改或者删除的数据,而幻读读到的是其它事务新插入的数据"
无论是脏读,不可重复读,还是幻读,它们都属于数据库的读一致性的问题,都是在一个事务里面前后两次读取出现了不一致的情况。
| 隔离级别          | 脏读 | 不可重复读  | 幻读 |
| ---------------- | ---- | ---------- | ---- |
| Read uncommitted |  √   |     √      |  √   |
| Read committed   |  ×   | 	√ 	   |  √   |
| Repeatable read  |  ×   |	    × 	   |  √   |
| Serializable 	   |  ×   | 	×	   |  ×   |
数据库的事务隔离越严格,并发副作用就越小,但付出的代价也就越大,
因为事务隔离本质上就是使事务在一定程度上串行化,需要根据具体的业务需求来决定使用哪种隔离级别。
代码语言:java
复制
4种事务隔离级别:
1、读未提交(read uncommitted):会产生脏读、幻读、不可重复读。
2、读已提交(read committed):会产生幻读、不可重复读。
3、可重复读(repeatable read):会产生幻读。
4、串行化(serializable):不产生,但效率低下

事务不同隔离级别会产生3种数据不一致情况:
1、脏读:读到其他事务未提交的数据;
2、不可重复读:前后读取的数据不一致; 
3、幻读:前后读取的记录数量不一致。

注释:InnoDB在可重复读的级别就已经解决了幻读的问题,这也是InnoDB使用可重复读作为默认隔离级别的原因。
InnoDB 引擎的默认隔离级别是「可重复读」,
InnoDB 通过next-key lock 锁(行锁和间隙锁的组合)来锁住记录之间的"间隙"和记录本身,
       防止其他事务在这个记录之间插入新的记录,这样就避免了幻读现象。

四种隔离级别具体是如何实现的呢?
1、读未提交:因为可以读到未提交事务修改的数据,所以直接读取最新的数据就好了;
2、读已提交:通过 Read View 来实现的,隔离级别是在读取每个数据前都生成一个 Read View(MVCC);
3、可重复读:通过 Read View 来实现的,隔离级别是启动事务时生成一个 Read View,然后整个事务期间都在用这个 Read View(MVCC)。
4、串行化:  通过加读写锁的方式来避免并行访问;

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档