
.
MySQL 的事务隔离级别是数据库并发控制的核心机制,用于解决多个事务同时操作数据时可能出现的 脏读、不可重复读 和 幻读 等问题。数据库标准定义了 4 种隔离级别,MySQL InnoDB 存储引擎全部支持,具体如下(按隔离程度从低到高排序):
-
定义:一个事务可以读取另一个未提交事务修改的数据。
-
问题:存在 脏读(读取到未提交的无效数据)、不可重复读和幻读。
-
适用场景:几乎不使用,仅在对数据一致性要求极低且追求极致性能时考虑。
-
定义:一个事务只能读取另一个已提交事务的数据,避免脏读。
-
解决问题:防止脏读。
-
存在问题:可能出现 不可重复读(同一事务内两次读取同一数据,结果因其他事务提交而不同)和幻读。
-
适用场景:多数互联网业务(如电商订单、支付场景),是 Oracle、SQL Server 等数据库的默认隔离级别。
-
定义:保证同一事务内多次读取同一数据的结果一致,不受其他事务提交的影响。
-
解决问题:防止脏读和不可重复读。
-
特殊说明:
MySQL InnoDB 通过 MVCC(多版本并发控制) 机制实现可重复读,且通过 间隙锁(Gap Lock) 解决了标准隔离级别中可能存在的 幻读 问题(这是 MySQL 的特有优化)。
-
适用场景:大多数业务场景,在一致性和并发性能间取得较好平衡。
-
定义:最高隔离级别,强制事务串行执行(类似单线程),完全避免并发冲突。
-
解决问题:防止脏读、不可重复读和幻读。
-
问题:并发性能极差,可能导致大量事务超时。
-
适用场景:对数据一致性要求极高且并发量极低的场景(如金融核心交易的特定步骤)。
SELECT @@global.transaction_isolation;
SELECT @@transaction_isolation;
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
SET SESSION transaction_isolation = 'SERIALIZABLE';
设置时需使用以下字符串值:
'READ-UNCOMMITTED'、'READ-COMMITTED'、'REPEATABLE-READ'、'SERIALIZABLE'
隔离级别越高,数据一致性越好,但并发性能越差。实际应用中,需根据业务对一致性和性能的需求选择:
-
多数场景:使用 MySQL 默认的 REPEATABLE READ
-
需兼容其他数据库(如 Oracle):可改为 READ COMMITTED
-
极端一致性要求:使用 SERIALIZABLE(谨慎使用)