1:Read uncommitted 读未提交。(可以读到其他事务未提交的数据)
开启事务A 修改数据 事务未提交。
开启事务B 查询到事务A修改的 未提交的数据
这种现象称为脏读(在一个事务中,读取到了其他事务未提交的数据)的情况。
2:Read committed 读提交(不可读到其他事务未提交的数据,可以读到其他事务已提交的数据)
开启事务A 修改数据 事务未提交。
开启事务B 未查询到事务A修改的未提交数据。
事务A提交,事务B查询到事务A修改的已提交数据,当事务B查询的时候,查询不到事务A正在进行的操作。
可能发生的情况:
事务B查询账户余额 有20元
此时事务A正在更改余额 为10元 没有提交事务,事务B在执行查询的时候余额仍然为 20元
此时事务A正在更改余额 为10元 并且提交了事务,事务B再执行查询账户余额 有10元
虽然避免了脏读,但是事务A的第一次查询是无效的。
这种现象称为不可重复读(在同一个事务内执行多次查询同一条数据,返回了不同的结果)。
一般情况不是一个问题,因为我们会以最后一次查询的结果为主。
3:Repeatable read 可重复读
开启事务B查询账户余额,此时不允许其他事务有修改余额的操作
避免了不可重复读
开启事务B查询 有1条数据
开启事务A插入数据(非修改操作)
事务B再次查询数据 有2条数据,此时事务B不知道为什么会有2条数据。
这种现象称为幻读(在同一个事务内执行多次查询,批量的数据,返回了不同数量)
4:Serializable 序列化
最高的隔离级别,由于事务一个一个进行执行,所以性能低
避免脏读,不可重复读,幻读