今天总算是搞明白了可重复读这种隔离级别中说的幻读是什么意思。然后把数据库的四种隔离级别整理一下:
在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。
一共有四种隔离级别,从低到高依次为:read uncommitted(未提交读), read commited(提交读), repeatable read(可重复读),serializable(可串行化)
较低的隔离级别支持可以执行更高的并发,和更小的系统开销
未提交读级别:事务中的修改,即使没有提交,对其他事务也都是可见的。事务能读取未提交的数据,也被称作脏读,这个级别会导致很多问题,在实际应用中一般不会用到。
提交读级别:解决了未提交读级别的脏读问题。一个事务开始时,只能看见已经提交的事务所做的修改。换句话说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读,因为同一个事务中两次执行同样的查询,可能会得到不一样的结果。(恰好在两次查询之间的时间,其他某个事务完成了对数据的更新)。
可重复读级别:上面的提交读级别解决了未提交读级别的脏读问题,但是无法保证在一个事务中两次读到同样记录的结果是一致的。此可重复读级别解决了此问题,能保证在同一个事务中,两次读取同样的记录结果是一致的。但是可重复读级别不能解决幻读的问题。幻读是指当某个事务在读取某个范围内的记录时,会产生幻行。(幻行可通过乐观锁和悲观锁来解决)。
可串行化级别:是最高级别,它通过强制事务串行化执行,避免了前面说的幻读的问题。但是会导致大量的超时和锁竞争的问题。
脏读:一行记录,两次读取结果不一样
幻读:一个范围的记录(几条记录),两次读取的记录条数不一样,通常是指多几条
提交读(不可重复读)级别解决了脏读问题,但存在不可重复读问题。
可重复读级别解决了可重复读问题,但是存在幻读问题
串行化级别解决了幻读问题。