一、什么是幻读,脏读,不可重复读?
事务A、B交替执行,事务A读取到事务B未提交的数据,这就是脏读。
在一个事务范围内,两个相同的查询,读取同一条记录,却返回了不同的数据,这就是不可重复读。
事务A查询一个范围的结果集,另一个并发事务B往这个范围中插入/删除了数据,并悄悄提交,之后事务A再次查询相同范围,两次读取到的结果集不一样,这就是幻读。
不同的隔离级别,在并发事务下可能会发生的问题:
二、事务的各个隔离级别都是如何实现的?
2.1读未提交
采取的是读不加锁的原理。
事务读不加锁,不阻塞其他事务的读和写;
事务写阻塞其他事务写,但不阻塞其他事务读。
2.2 读取已提交&可重复读
读取已提交和可重复读级别利用了ReadView和MVCC,也就是每个事务只能读取它能看到的版本(ReadView)。
READ COMMITTED:每次读取数据前都生成一个ReadView
REPEATABLE READ : 在第一次读取数据时生成一个ReadView
2.3 串行化
串行化的实现采用的是读写都加锁的原理。
串行化的情况下,对于同一行事务,写会加写锁,读会加读锁。
当出现读写锁冲突的时候,后访问的事务必须等待前一个事务执行完成才能继续执行。
标签:事务,加锁,隔离,幻读,脏读,提交,ReadView,读取 From: https://blog.51cto.com/u_16255459/8018800