1. 脏读、不可重复读、幻读是什么?
在理解隔离级别前,先明确三种常见的并发问题:
脏读(Dirty Read):一个事务读到了另一个事务尚未提交的数据。如果后者回滚,前者就读到了“脏”数据。 不可重复读(Non-repeatable Read):同一个事务内,两次读取同一行数据结果不同,因为其他事务在这期间修改并提交了该行。 幻读(Phantom Read):同一个事务中,两次执行相同查询,返回的行数不同,因为其他事务插入或删除了符合条件的新行。2. MySQL 的四种事务隔离级别
MySQL 支持 SQL 标准定义的四种隔离级别,从低到高依次为:
READ UNCOMMITTED(读未提交)最低级别。允许读取其他事务未提交的数据,可能出现脏读、不可重复读、幻读。性能最好,但数据一致性最差。 READ COMMITTED(读已提交)
只能读取已提交事务的数据,避免了脏读。但不可重复读和幻读仍可能发生。
Oracle 和 SQL Server 默认使用此级别。 REPEATABLE READ(可重复读)
保证在同一事务中多次读取同一数据结果一致,解决了脏读和不可重复读。
MySQL InnoDB 引擎默认级别。通过多版本并发控制(MVCC)和间隙锁(Gap Lock)机制,在大多数场景下也避免了幻读。 SERIALIZABLE(串行化)
最高隔离级别。所有事务串行执行,彻底避免脏读、不可重复读、幻读。
通过强制加锁实现,但并发性能最差,只用于对一致性要求极高的场景。
3. 如何设置和查看隔离级别?
你可以通过以下命令查看当前会话或全局的隔离级别:
SELECT @@transaction_isolation;
设置当前会话的隔离级别示例:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
设置全局隔离级别(影响新连接):
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
