MySQL的事务隔离级别有哪些?
MySQL的事务隔离级别有四种,从低到高分别是:读未提交、读已提交、可重复读、串行化。
- 读未提交:你可以读取到别人修改但未提交的数据,相当于毫无隔离可言。会出现脏读、不可重复读、幻读
- 读已提交:读别人已经提交的数据,但是同一事务中,读同一数据可能出现不一致,会出现不可重复读、幻读
- 可重复读:不管别的事务怎么修改,同一事务内读的都是第一次的快照。会出现幻读。
- 串行化:相当于事务一个一个排队执行,等于把并发关了。
MySQL默认为什么用可重复读?
- 读已提交在同一事务中,读同一数据可能出现不一致
- 在主从复制的过程中,用读已提交可能会造成同一条SQL在主库和从库结果可能对不上。
- 可重复读可以保证同一事务内数据一致,配合bin log主从复制更稳定。
数据库的脏读、不可重复读、幻读分别是什么?
- 脏读:读到其他事务尚未提交的数据
- 不可重复读:同一事务中读到的两次数据不一致,被其他事务给修改了
- 幻读:同一事务中执行的两次范围查询返回的结果不一样。中间有其他事务插入或删除了符合条件的数据。
InnoDB怎么解决这些问题?
- 脏读:mvcc天然解决,读的是快照,未提交的版本不可见
- 不可重复读:在可重复读的隔离级别下,ReadView在事务开始时就固定了,之后的每次访问都是同一个ReadView。
- 幻读:当前读通过间隙锁和临键锁,锁住区间,别的事务不能插入,快照读走MVCC其他版本不可见