面试题答案
一键面试1. 读未提交(Read Uncommitted)
- 含义:一个事务可以读取另一个未提交事务的数据。这是最低的隔离级别,几乎不提供什么并发控制。
- 并发问题:
- 脏读:会出现。因为一个事务可以读到另一个未提交事务修改的数据,如果未提交事务回滚,那么读取到的数据就是无效的,即脏数据。
- 不可重复读:会出现。在同一事务内,多次读取同一数据时,另一个并发事务可能在期间提交了对该数据的修改,导致多次读取结果不一致。
- 幻读:会出现。在同一事务内,多次执行相同的查询语句,另一个并发事务可能在期间插入或删除了符合查询条件的新数据,导致多次查询结果的记录数不一致。
2. 读已提交(Read Committed)
- 含义:一个事务只能读取已经提交的事务的数据。这可以避免脏读问题。
- 并发问题:
- 脏读:不会出现。因为只能读取已提交的数据,所以不存在读取到未提交事务的脏数据情况。
- 不可重复读:会出现。在同一事务内,多次读取同一数据时,另一个并发事务可能在期间提交了对该数据的修改,导致多次读取结果不一致。
- 幻读:会出现。在同一事务内,多次执行相同的查询语句,另一个并发事务可能在期间插入或删除了符合查询条件的新数据,导致多次查询结果的记录数不一致。
3. 可重复读(Repeatable Read)
- 含义:在一个事务内,多次读取同一数据时,其值保持不变。它通过锁定查询返回的行来实现这一点。
- 并发问题:
- 脏读:不会出现。同读已提交,只能读取已提交的数据。
- 不可重复读:不会出现。因为在事务内多次读取同一数据,数据值不会改变,即使其他事务对该数据进行了修改并提交,本事务看到的数据还是最初读取的值。
- 幻读:在 PostgreSQL 中,默认的可重复读隔离级别通过多版本并发控制(MVCC)可以避免幻读。但在某些数据库实现中,如果没有类似 MVCC 的机制,幻读仍可能出现。
4. 串行化(Serializable)
- 含义:最高的隔离级别,所有事务依次逐个执行,就好像没有并发一样。这可以确保不会出现任何并发问题。
- 并发问题:
- 脏读:不会出现。因为事务是串行执行,不存在并发读取未提交数据的情况。
- 不可重复读:不会出现。事务逐个执行,不存在其他事务干扰当前事务读取的数据。
- 幻读:不会出现。事务串行执行,不会有新的数据在当前事务执行期间被插入或删除,导致查询结果变化。