脏读:
一个事务读取到另一个事务未提交的数据(READ-UNCOMMITTED下会发生)
不可重复读和幻读(READ-COMMITTED下会发生):
不可重复读:同一个事务俩次读取同一数据的内容不同(因为另一个事务删除或修改了数据)
幻读:同一个事务俩次读取的数据记录数目不同(因为另一个事务添加了新数据)
默认隔离级别(REPEATETABLE-READ)可以解决不可重复读,不一定能解决幻读:
https://blog.youkuaiyun.com/qq_35970057/article/details/108402944 里面的Phantom Problem问题
不可重复:
RETPEATETABLE-READ使用Next-Key Locking,当发生索引降级时,也会有一条Record Lock,X锁锁住索引本身,所以 另一个事务可以更新此条记录。第二个事务提交后,但也必须第一个事务也提交后,第一个事务才能读到第二个事务提交的容。
没有索引降级的时候更是如此。
幻读:
因为MVCC,所以正常的select ...from ... where ... 都是快照读,读取的是快照内容,只有为:
select ... from ...where ... for update
select ... from ...where ... lock in share mode
update
delete
等操作时(这些操作都是加锁的,所以操作的肯定都是当前数据),为当前读
当俩个事务都是快照读时,是不会发生幻读的
当俩个都是当前读时,会发生阻塞,即也不会发生幻读
只有当一个是快照读,一个是当前读时,会发生幻读