interview
backend-classic
MySQL事务有哪些隔离级别、分别有什么特点,以及MySQL的默认隔离级别是什么?

后端经典面试题合集, MySQL 事务有哪些隔离级别,分别有什么特点,以及 MySQL 的默认隔离级别是什么?

后端经典面试题合集, MySQL 事务有哪些隔离级别,分别有什么特点,以及 MySQL 的默认隔离级别是什么?

QA

Step 1

Q:: MySQL 事务有哪些隔离级别、分别有什么特点?

A:: MySQL 支持四种事务隔离级别:

1. READ UNCOMMITTED(读未提交):在这个级别下,事务中的修改,即使未提交,对其他事务也是可见的。其特点是会出现脏读,即一个事务可以读取到另一个事务未提交的数据。

2. READ COMMITTED(读已提交):在这个级别下,事务只能读取到其他事务已提交的数据。这种隔离级别避免了脏读,但可能会出现不可重复读,即同一事务在不同时间读取到的同一数据可能会不同。

3. REPEATABLE READ(可重复读):在这个级别下,事务在开始时看到的数据是一致的,即使其他事务修改了数据,当前事务也不会看到修改后的数据。这种隔离级别避免了脏读和不可重复读,但可能会出现幻读。MySQL 的 InnoDB 存储引擎通过使用 MVCC(多版本并发控制)机制解决了幻读问题。

4. SERIALIZABLE(可串行化):在这个级别下,所有事务串行执行,强制事务之间完全隔离,解决了脏读、不可重复读和幻读的问题,但性能较差,适用于高要求的场景。

Step 2

Q:: MySQL 的默认隔离级别是什么?

A:: MySQL InnoDB 存储引擎的默认隔离级别是 REPEATABLE READ(可重复读)。这个级别在性能和数据一致性之间取得了平衡,适用于大多数场景。

用途

面试中会询问事务隔离级别,是因为数据库事务是保证数据一致性的关键机制之一。在实际生产环境中,隔离级别的选择会直接影响到数据库的并发性能和数据的正确性。例如,在高并发的环境下,如果隔离级别选择不当,可能会导致数据出现脏读、不可重复读或者幻读,进而导致业务逻辑错误。了解并能够正确设置事务的隔离级别对于开发者优化数据库性能、保障数据一致性具有重要意义。\n

相关问题

🦆
什么是脏读,不可重复读和幻读?

脏读、不可重复读和幻读是并发事务中可能遇到的问题:

1. 脏读:一个事务可以读取到另一个事务未提交的数据。

2. 不可重复读:一个事务在读取相同数据时,前后两次读取的数据可能不同,这是因为其他事务在两次读取之间提交了对数据的修改。

3. 幻读:一个事务在读取数据的过程中,如果其他事务插入了符合查询条件的新记录,那么当这个事务再次读取时,会发现有‘幻影’记录。

🦆
MySQL 如何通过 MVCC 机制实现可重复读?

MVCC(Multi-Version Concurrency Control,多版本并发控制)通过为每一行数据保存多个版本的快照来实现事务隔离。在 REPEATABLE READ 隔离级别下,每个事务只能看到事务开始时的数据状态,即使其他事务在进行修改,当前事务也看不到这些修改。因此,MVCC 能够避免不可重复读,并通过间隙锁(Gap Lock)机制避免幻读。

🦆
什么是间隙锁Gap Lock?

间隙锁是一种用来防止幻读的锁机制。它锁定的是一个范围,而不是具体的一行数据。在事务执行期间,其他事务无法在锁定的范围内插入新数据,从而避免幻读的发生。

🦆
如何选择 MySQL 事务的隔离级别?

选择隔离级别时,需要在数据一致性和系统性能之间进行权衡:

1. READ UNCOMMITTED:适用于只读操作多、更新操作少的场景,最大限度提高并发性能。

2. READ COMMITTED:适用于多数读取操作、少量更新操作的场景,避免脏读。

3. REPEATABLE READ:适用于需要保证数据一致性的多数场景,平衡性能和一致性。

4. SERIALIZABLE:适用于极端要求数据一致性的场景,例如金融交易系统。