mysql四个隔离级别
-
在READ UNCOMMITTED隔离级别下,脏读、不可重复读、幻读都可能发生。
-
在READ COMMITTED隔离级别下,**不可重复读、幻读可能发生,脏读不可以发生。
-
在REPEATABLE READ隔离级别下,幻读可能发生,脏读和不可重复读不可以发生。
-
在SERIALIZABLE隔离级别下,上述问题都不可以发生。
脏读:脏读的产生是因为当前事务读取了另一个未提交事务写的一条记录 解决方案:另一个事务在写记录的时候就给这条记录加锁,那么当前事务就无法继续读取该记录了,所以也就不会有脏读问题的产生了 不可重复读:当前事务先读取一条记录,另外一个事务对该记录做了改动之后并提交之后,当前事务再次读取时会获得不同的值 解决方案:如果在当前事务读取记录时就给该记录加锁,那么另一个事务就无法修改该记录,自然也不会发生不可重复读了 因为当前事务读取了一个范围的记录,然后另外的事务向该范围内插入了新记录,当前事务再次读取该范围的记录时发现了新插入的新记录,我们把新插入的那些记录称之为幻影记录 解决方案:
实际上mysql 在repeatable read级别已经解决幻读问题:MySQL在REPEATABLE READ隔离级别下是可以解决幻读问题的,解决方案有两种,可以使用MVCC方案解决,也可以采用加锁方案解决
-
使用mvcc方案解决READ COMMITTED隔离级别下脏读原理:一个事务在执行过程中每次执行SELECT操作时都会生成一个ReadView,ReadView的存在本身就保证了事务不可以读取到未提交的事务所做的更改,也就是避免了脏读现象;
-
使用mvcc方案解决可重复读的原理是:REPEATABLE READ隔离级别下,一个事务在执行过程中只有第一次执行SELECT操作才会生成一个ReadView,之后的SELECT操作都复用这个ReadView,这样也就避免了不可重复读和幻读的问题