什么是幻读?
SQL92-幻读(phantom read):SQL-transaction T1 reads the set of rows N that satisfy some . SQL-transaction T2 then executes SQL-statements that generate one or more rows that satisfy the used by SQL-transaction T1. If SQL-transaction T1 then repeats the initial read with the same , it obtains a different collection of rows.
在一个事务中一次查询之后,有另一个事务进行了插入,插入的内容是满足上面查询条件的,如果这个事务当中还有第二次同样查询条件的查询,那么就会导致了第二次查询得到的结果集增多。
RR 与 RC
MySQL-InnoDB-RR:可重复读对事务涉及到的数据加读锁和写锁,读锁和写锁一直持有直到事务结束,不再加范围锁。
MySQL-InnoDB-RC:读已提交对事务涉及到的数据加读锁和写锁,写锁会一直持续到事务结束,读锁在查询完成后会马上释放。
RC:由于缺乏贯穿整个事务的读锁,事务涉及到的数据可能被其他事务改变。
RU:只加写锁,完全不加读锁,导致可以读到其它事务加了写锁的数据,因而导致脏读。
MVCC:
- 对数据库的任何修改都不会覆盖之前的数据,产生一个新版本与老版本共存,达到读取时完全不加锁。
- MVCC 只针对读&