简单介绍下Mysql数据库的四种隔离级别,以及受事务隔离级别影响可能会出现的几种异常读取:脏读、不可重复读、幻读。
事务隔离的概念
数据库在读数据时,会将数据页调取到内存。事务隔离就是要让一个事务对数据页数据行做的更新操作在没有更新提交前,不允许另一个事务读取。
事务的四种隔离级别
- RU (读未提交)
可以读取到事务未提交的数据,隔离性差,会出现脏读、不可重复读、幻读
- RC (读已提交)
可以读取到事务已提交的数据,隔离性一般,不会出现脏读,但是会出现不可重复读、幻读
- RR (可重复读,Mysql默认的事务隔离级别)
可以防止脏读、不可重复读问题、幻读,但是并发能力较差;
会使用next lock锁来防止幻读问题,但是锁的代价比较高,会更加耗费CPU资源,占用系统性能;
- SR (可串行化)
隔离性最高,可以实现串行化读取数据,但是事务的并发度就没有了
脏读、不可重复读、幻读
看字面意思这几个东西实在不太好理解,咱们大白话解释下:
- 脏读(也叫:当前内存读)
事务a修改了数据但还没提交,此时事务b查询了事务a修改过的数据,突然事务a遇到异常回滚导致修改最终没有生效。结果事务b拿到的就是脏数据,这种情况就叫脏读。
- 不可重复读
事务b中有两次查询,在两次查询中间,事务a对数据做了修改并正常提交,结果事务a两次查询的结果不一致,这种情况叫不可重复读。
- 幻读
事务b中有两次操作:先修改,后查询修改结果。在两次操作中间,事务a插入了一条其他数据,这条数据就没有被事务b修改到,结果事务b后来去查询修改结果的时候,发现有些数据没修改成功(这些数据其实是事务a偷偷插进去的),事务b感觉自己好像出现了幻觉,这种情况叫幻读。
从形式上看,不可重复读和幻读很像,都是某个事务的两次操作中间出现了其他事务的干扰,导致该事务的前后结果不和协。
不同之处在于,不可重复读描述的是事务的两次查询不一致的现象,而幻读则是指“先修改,再查询,结果修改没完全生效”的情况,二者还是有一点区别的。