事务隔离级别是ACID中的I。
事务隔离级别有:
读未提交(RU):事务能够读取到其他事务还未提交的数据。
读已提交(RC):事务只能读取到其他事务已经提交的数据。
可重复读(RR):事务多次读取的数据是相同的。
可串行化(S):完全串行化的读,每次读都需要获得表级共享锁,读写相互会阻塞。
read uncommitted,read committed,repeated read,serializable
脏读:就是指一个事务正在修改数据库,修改还没有提交,此时另一个事务也访问数据库,使用了这个数据,就造成了脏读。脏读是非常危险的,因为数据可以在提交之前回滚,执行脏读的事务读取了没有被数据库认可的数据。读未提交的隔离级别会出现脏读。
不可重复读:就是指事务两次读取数据,返回结果不一样。更准确地说,在行不变的情况下(主键索引不变),这一行数据发生变化,如果是增加或删除一条数据,那就不是不可重复读。
幻读:在一次事务查询结果里出现某一行数据,但是该数据没有出现在之前的查询结果里。是由于另一个事务插入某一行数据或者更新某一行数据,并提交了。
在我看来脏读也是不可重复读现象,但是不可重复读还有一种额外情况是脏读没有的,就是一个事务读取了另一个事务已经提交的数据,导致前后两次读取不一样。
幻读跟不可重复读也很像,事务第二次查询出了一个数据,但是该数据并未出现在第一次查询的结果集里。如果该数据是修改数据,那么该现象既属于不可重复读,也属于幻读。如果该数据是新增或删除的数据,那该现象就不属于不可重复读,但属于幻读。
防止不可重复读的措施在于,将事务已经读取的数据的行加锁,这样再次读取的时候,不会发生变化,但是却无法锁住insert数据。insert导致事务读取到的数据多了之前没有出现过的行,这就是幻读。幻读不能通过行级锁解决,可串行化隔离级别能够防止幻读的出现。可串行化隔离级别,读用读锁,写用写锁,读锁与写锁互斥,因此无法在正在读的数据中写入数据,可以有效避免脏读/不可重复读/幻读,但是数据库并发能力下降。
不可重复读和幻读最大的区别在于,如何通过锁机制解决它们的问题。
MVCC使用乐观锁避免这两个问题。