一、四种事务隔离级别:
事务在操作时的理想状态:所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题,所以在SQL标准中定义了四种隔离级别来优化解决这些问题。
1. 读未提交(READ UNCOMMITTED)
这种隔离级别事务可以读到其他事务中未提交的数据。例如:事务A在更新表数据,但是没有提交。此时事务B去查询表数据会查到事务A没有提交的数据,读取未提交的数据,也被称之为脏读(Dirty Read)。
2. 读已提交(READ COMMITTED)
这种隔离级别的事务能读取到已经提交事务的数据,所以它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL 查询中,可能会得到不同的结果,这种在一个事务中前后两次读取的结果并不致的现象被称为不可重复读 。
3. 可重复读(REPEATABLE READ)
此隔离级别也是MySQL默认的隔离级别;这种隔离级别事务能确保同一事务多次查询的结果一致,他解决了不可重复读问题,但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但自己就是插入不进去,这种现象被称为幻读。
4. 序列化(SERIALIZABLE)
序列化,事务最高隔离级别,但是MySQL一般不用这种隔离级别。它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。
二、四种隔离级别存在的的并发访问的问题:
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |