脏读: 当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读: 是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。(对数据的修改(更新))
幻读:第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。(对数据的插入与删除)
- 可重复读会导致出现幻读,但如果使用普通的读,会得到一直性的结果。如果使用了加锁的读,就会读到最新的提交结果
数据库事务隔离级别
Read UnCommitted(读未提交):最低的隔离级别。一个事务可以读取另一个事务并未提交的更新结果。
Read Committed(读提交):一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以的读取到同一笔数据更新后的结果。
Repeatable Read(重复读):mysql的默认级别。整个事务过程中,对同一笔数据的读取结果是相同的,不管其他事务是否在对共享数据进行更新,也不管更新提交与否。
Serializable(序列化):最高隔离级别。所有事务操作依次顺序执行。注意这会导致并发度下降,性能最差。通常会用其他并发级别加上相应的并发锁机制来取代它。该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
示例
数据库表users的基本信息
以读未提交(read-uncommitted)举例,其他同理
出现了脏读,session2的第五步读取了session1还未提交的数据,当session1回滚时,此时session读的的数据是无效的。