Read committed(已提交读):在这个隔离级别,所有的更新操作都会在提交后才对别的事物可见,事物在执行过程中会对更新操作涉及的数据添加排他锁,直到事物结束后才释放锁,但不会对读操作添加共享锁。因此,存在不可重复读现象,当一个事物存在多次查看某一数据的现象,而在此过程中别的事物存在对这个数据更新操作的commit,会导致两次查询的结果不一致。(在此隔离级别不存在范围锁)
简而言之,已提交读只保证了你所读的数据在那个时候是提交了的,但是没有保证在同一事物中,你再次读取的时候数据还是一样的。因为数据在读了以后是可以随意改变的。
Repeatable read(可重复读):针对Read committed不可重复读的问题,通过在事物的查询过程中,为对应的数据添加一个共享锁来保证事物执行时对应的数据不被更新。由于依然没有范围锁,当一个事物存在多次按照范围查看某一数据的现象,而在此过程中别的事物存在对这一查询范围内插入操作的commit,会导致后执行的查询会查到先执行的查询没查到的数据,就会存在幻读的现象。在此隔离级别下,MVCC可以通过创建快照解决幻读的现象。在innodb中也可以使用间隙锁来解决幻读问题(当数据进行条件,范围检索数据的时候,对其范围内也许并不存在的值也加锁)
Serializable(可串行化):可在可重复读(针对读写语句分别添加共享锁和排他锁)的基础上,通过对存在范围查询的事物添加一个对应的范围锁来解决幻读的问题。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted | YES | YES | YES |
Read committed | NO | YES | YES |
Repeatable read | NO | NO | YES |
Snapshot | NO | NO | NO |
serializable | NO | NO | NO |