隔离级别脏读不可重复读幻读Read Uncommited 读取未提交是是是Read Commited 读取已提交否是否Repeatable Read 可重复读否否是Serialzable 可串行化否否否
52.事务的各个隔离级别都是如何实现的?
读未提交
读未提交,就不用多说了,采取的是读不加锁原理。
- 事务读不加锁,不阻塞其他事务的读和写
- 事务写阻塞其他事务写,但不阻塞其他事务读;
读取已提交&可重复读
读取已提交和可重复读级别利用了ReadView和MVCC,也就是每个事务只能读取它能看到的版本(ReadView)。
- READ COMMITTED:每次读取数据前都生成一个ReadView
- REPEATABLE READ :在第一次读取数据时生成一个ReadView
串行化
串行化的实现采用的是读写都加锁的原理。
串行化的情况下,对于同一行事务,写会加写锁,读会加读锁。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
53.MVCC了解吗?怎么实现的?
MVCC(Multi Version Concurrency Control),中文名是多版本并发控制,简单来说就是通过维护数据历史版本,从而解决并发访问情况下的读一致性问题。关于它的实现,要抓住几个关键点,隐式字段、undo日志、版本链、快照读&当前读、Read View。
版本链
对于InnoDB存储引擎,每一行记录都有两个隐藏列DB_TRX_ID、DB_ROLL_PTR
- DB_TRX_ID,事务ID,每次修改时,都会把该事务ID复制给DB_TRX_ID;
- DB_ROLL_PTR,回滚指针,指向回滚段的undo日志。

表隐藏列