面试题答案
一键面试1. MySQL 支持的四种事务隔离级别
- 读未提交(Read Uncommitted):一个事务可以读取另一个未提交事务的数据。这是隔离级别最低的一种。
- 读已提交(Read Committed):一个事务只能读取已经提交的事务的数据。在这个级别下,“脏读”现象不会发生。
- 可重复读(Repeatable Read):在同一个事务内,多次读取同一数据返回的结果是一致的,不管其他事务是否修改并提交了该数据。此级别解决了“脏读”和“不可重复读”问题。
- 串行化(Serializable):最高的隔离级别,所有事务依次逐个执行,这样就完全避免了并发问题。
2. 不同隔离级别下可能出现的并发问题
- 读未提交:会出现“脏读”、“不可重复读”、“幻读”问题。脏读指一个事务读取到另一个未提交事务修改的数据;不可重复读指在一个事务内,多次读取同一数据,由于其他事务的修改导致每次读取结果不一致;幻读指在一个事务内,按照某个条件多次读取数据时,由于其他事务插入了符合该条件的新数据,导致每次读取结果集的数量不同。
- 读已提交:避免了“脏读”,但仍会出现“不可重复读”和“幻读”。
- 可重复读:解决了“脏读”和“不可重复读”,但在某些情况下仍可能出现“幻读”(MySQL InnoDB引擎通过MVCC机制,在可重复读级别下实际已解决幻读问题)。
- 串行化:不会出现任何并发问题,因为事务是串行执行的。
3. 每种隔离级别对数据库性能优化方面的利弊
- 读未提交:
- 利:并发性能最高,因为几乎没有任何锁机制和隔离限制,事务执行非常快。
- 弊:数据一致性最差,可能读取到未提交数据,导致业务逻辑出现错误。
- 读已提交:
- 利:性能较好,锁的开销相对较小,能满足大多数读多写少的业务场景。
- 弊:无法避免不可重复读和幻读问题,在一些对数据一致性要求高的场景下不适用。
- 可重复读:
- 利:保证了事务内数据的一致性,适用于对数据一致性要求较高的场景,MySQL InnoDB引擎在该级别下通过MVCC机制实现了较好的并发性能。
- 弊:性能比读已提交略低,因为需要更多的机制来保证数据一致性,如需要维护更多的版本信息。
- 串行化:
- 利:数据一致性最强,不存在任何并发问题。
- 弊:性能最差,因为事务只能串行执行,严重影响并发处理能力。
4. 实际项目中根据业务场景选择合适的隔离级别
- 读多写少且对数据一致性要求不高:如一些统计类报表业务,可选择读未提交隔离级别,以获取较高的并发性能。
- 读多写少且对数据一致性有一定要求:一般的业务查询场景,读已提交隔离级别通常能满足需求,能在性能和一致性之间取得较好平衡。
- 读写都较多且对数据一致性要求较高:如电商订单处理、金融交易等场景,可选择可重复读隔离级别,既能保证数据一致性,又有较好的并发性能(特别是InnoDB引擎下)。
- 对数据一致性要求极高且并发量较小:如涉及资金清算等关键业务,可选择串行化隔离级别,以确保数据的绝对一致性。