面试题答案
一键面试读未提交(Read Uncommitted)
- 锁策略:基本不使用锁来保证事务隔离,一个事务可以读取另一个未提交事务修改的数据。
- 防止脏读、不可重复读和幻读: 会出现脏读,因为允许读取未提交数据;不可重复读和幻读也可能发生,因为其他事务可以随时修改或插入数据。
- 适用性:在对数据一致性要求不高,追求高并发性能的场景下可能适用,如某些实时性监控数据场景。
- 潜在风险:数据一致性难以保证,可能导致业务逻辑错误,因为读取到的数据可能是无效或回滚的数据。
读已提交(Read Committed)
- 锁策略:使用行级锁,在读取数据时,给所读取的行加共享锁,在修改数据时加排他锁。事务结束时释放锁。
- 防止脏读、不可重复读和幻读: 可以防止脏读,因为只能读取已提交的数据。但不可重复读可能发生,因为在同一事务内多次读取同一数据时,其他事务可能已提交修改;幻读也可能发生,因为在同一事务内多次查询时,其他事务可能插入新数据。
- 适用性:适用于大多数对数据一致性有一定要求,但并发度也较高的业务场景,如电商订单查询等。
- 潜在风险:可能存在不可重复读和幻读问题,影响某些依赖数据一致性的业务逻辑。
可重复读(Repeatable Read)
- 锁策略:使用行级锁和间隙锁(Next-Key Locks)。行级锁保证对读取的行加共享锁,在修改时加排他锁。间隙锁则锁定数据行之间的间隙,防止其他事务在该间隙插入数据。
- 防止脏读、不可重复读和幻读: 可以防止脏读和不可重复读,因为同一事务内多次读取数据时,数据状态保持一致。在一定程度上可以防止幻读,由于间隙锁的存在,其他事务无法在当前事务查询的范围内插入新数据。但在某些特殊情况下(如使用自增主键),幻读仍可能发生。
- 适用性:适用于对数据一致性要求较高,不允许不可重复读和幻读的场景,如金融交易等。
- 潜在风险:间隙锁可能导致锁争用加剧,降低并发性能,因为它锁定的范围更大,可能会阻塞其他事务的插入操作。
串行化(Serializable)
- 锁策略:完全使用锁来实现事务串行执行,对所有读取和写入操作都加锁,事务依次执行。
- 防止脏读、不可重复读和幻读: 可以完全防止脏读、不可重复读和幻读,因为事务是串行执行的,不存在并发干扰。
- 适用性:适用于对数据一致性要求极高,几乎不允许并发的场景,如涉及关键数据的修改、重要配置的变更等。
- 潜在风险:并发性能极低,因为事务只能一个一个执行,可能导致系统性能瓶颈,尤其在高并发场景下。