面试题答案
一键面试幻读产生的原因
- 并发事务特性:在高并发场景下,多个事务同时执行。当一个事务按照一定条件读取数据后,另一个事务在相同条件下插入了新的数据行。
- 数据库隔离级别:在较低的隔离级别(如读已提交Read Committed)下,事务只能保证读取到已提交的数据,但不能阻止其他事务插入新的数据,导致再次按照相同条件读取时,出现了“幻觉”般的新数据行。
在PostgreSQL不同隔离级别下避免幻读的设置及性能影响
- 可重复读(Repeatable Read)
- 设置方式:在PostgreSQL中,默认的事务隔离级别就是可重复读。开启事务后,在事务内的所有查询会基于事务开始时的快照进行,所以不会看到其他事务插入的新数据,从而避免幻读。例如:
BEGIN;
-- 业务逻辑
COMMIT;
- **性能影响**:因为基于快照读,所以不需要每次查询都获取最新数据,减少了锁竞争,读性能较好。但由于可能存在长时间持有快照,可能导致数据库需要保留更多的旧版本数据,增加了存储开销。同时,写操作可能会因为需要与读操作协调版本控制,在一定程度上影响写性能。
2. 串行化(Serializable) - 设置方式:可以在开启事务时指定隔离级别为串行化。例如:
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 业务逻辑
COMMIT;
- **性能影响**:串行化隔离级别通过强制事务串行执行来避免幻读以及其他并发问题。这意味着所有事务依次执行,不存在并发执行的情况,虽然彻底避免了幻读,但性能最差。因为事务之间的并发度为0,大量事务等待执行,会导致响应时间变长,系统吞吐量降低。