mysql默认隔离
隔离级别有四种
Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty
Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
这种隔离级别解决了脏读问题
Repeatable Read(可重复读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行信息。
即查询id等于1的数据第一次查询和第n次查询之间只要没对id为1的数据进行过其他更新操作,那么前后查询的数据是一致的,不论其他事务是否修改了id为1这一行的数据,从而通过undolog解决了不可重复读问题
不过理论上,这会导致另一个棘手的问题:幻读
(Phantom Read)。
即按范围进行查询d的时候事务内前后两次查询得到的结果集行数不一致
InnoDB索引引入了mvcc机制从而可以解决这个问题,
需要程序手动控制在进行范围查询的时候加上for update关键字,这样会形成间隙锁和行锁结合起来的Next-Key Lock来解决幻读问题,并在事务结束后释放锁
当前读
当前读指的是在进行数据查询的时候从数据库内获取指定行最新的数据
快照读
快照读指的是从undolog中读取当前事务第一次获取的数据若事务内之前没有获取过指定id的数据那么是触发当前读获取数据并记录,事务内下一次获取的时候则产生快照读
如果在两次相同的读取之间进行了数据修改那么下一次读取就是获取修改后的数据信息