数据库-事务隔离级别
READ-UNCOMMITED(读未提交) 事务A能读到事务B未提交的数据,也就有了脏读,这个事务隔离级别会发生 脏读、不可重复读、幻读 。 READ-COMMITED(读已提交) 事务只能看到已经提交的数据,事务再提交前的操作对其他事务是不可见的。 这个级别可能会出现 不可重复读 ,事务A先读到了c,但是在事务A提交前,事务B修改了c并且提交了,事务A再读就和原来的不一样了,重复读的结果不一样,还可能出现 幻读 。 REPEATABLE READ(可重复读) 同一事务中多次读取同样的记录的结果是一样的,这个MySQL默认的隔离级别。 可能出现 幻读 ,比如事务A读取了某个范围内的记录,事务B再这个范围内插入了新的记录,那么A再次读取的时候就出现了幻行。 在MySQL的InnoDB和XtraDB中通过MVCC解决了幻读。 SERIALIZABEL(可串行化) 强制事务串行执行,避免了前面所有的问题,可能会导致大量超时和锁竞争的问题。 MVCC(多版本并发控制) InnoDB是通过每行后面保存 两个隐藏的列 来实现的,分别保存 行的创建时间和过期时间 ,保存时时系统版本号,没开始一个新的事务都会递增这个版本号。 在可重复读下的MVCC: SELECT: 1)InnoDB只查找早于当前事务版本的数据行,也就是行的系统版本号要小于等于事务的系统版本号