Mysql-3-事务隔离级别

2024-03-10 21:01:52 浏览数 (1)

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、串行化:  通过加读写锁的方式来避免并行访问;

0 人点赞