面试题答案
一键面试读已提交(Read Committed)
- 临键锁使用:该隔离级别下,MySQL 一般使用行锁,而非临键锁。只有在执行
SELECT ... FOR UPDATE
或SELECT ... LOCK IN SHARE MODE
语句时才会使用临键锁。 - 原因:读已提交隔离级别只保证读取到已经提交的数据,允许在事务执行过程中其他事务对数据进行修改。因此,普通的读操作不需要使用临键锁来防止幻读,因为每次读取都是最新已提交的数据。
- 应用场景:适用于大多数并发读取操作频繁,且对幻读不太敏感的场景,如一般的查询报表系统。
可重复读(Repeatable Read)
- 临键锁使用:在可重复读隔离级别下,MySQL 默认使用临键锁。临键锁会锁定索引记录及记录之间的间隙,以防止幻读。
- 原因:此隔离级别保证在一个事务内多次读取同一数据时,读到的数据是一致的。通过使用临键锁,能够阻止其他事务在当前事务执行期间在锁定范围内插入新数据,从而避免幻读问题。
- 应用场景:适用于对数据一致性要求较高,不允许幻读的场景,例如涉及资金交易等对数据准确性和一致性要求极高的业务场景。
串行化(Serializable)
- 临键锁使用:串行化隔离级别下,MySQL 广泛使用临键锁,对所有读取的行及其间隙都加锁,确保事务完全串行执行。
- 原因:该隔离级别是最高的隔离级别,完全避免了并发问题,通过对所有相关数据加锁,强制事务按顺序执行,杜绝了脏读、不可重复读和幻读。
- 应用场景:适用于对数据一致性和完整性要求极为严格,并发程度较低的场景,如某些涉及核心数据的银行内部系统等。
选择合适隔离级别的建议
- 考虑并发性能与数据一致性平衡:如果应用对并发性能要求较高,对幻读不太敏感,读已提交是较好选择;若对数据一致性要求高,可重复读能在保证一致性的同时维持一定并发性能;对于一致性要求极高且并发低的场景,选择串行化。
- 分析业务场景特性:对于简单查询报表业务,读已提交即可;而金融交易、库存管理等业务,因对数据准确性要求高,可能需选择可重复读甚至串行化隔离级别。