MySQL默认隔离级别为REPEATABLE READ,可通过SET SESSION或SET GLOBAL命令升级至SERIALIZABLE等更高级别以避免幻读,但会降低并发性能,需权衡一致性与性能需求。

在 MySQL 中调整事务隔离级别可以通过设置会话级或全局级的隔离级别来实现。默认情况下,MySQL 的事务隔离级别是 REPEATABLE READ,但在某些并发场景下,你可能需要升级到更高的隔离级别(如 SERIALIZABLE)以避免脏读、不可重复读或幻读问题。
查看当前事务隔离级别
在修改之前,先确认当前的隔离级别:
SELECT @@transaction_isolation;或者查看会话级别的设置:
SELECT @@session.transaction_isolation;查看全局隔离级别:
SELECT @@global.transaction_isolation;支持的事务隔离级别
MySQL 支持以下四种标准隔离级别:
- READ UNCOMMITTED:最低级别,允许读取未提交的数据(脏读)
- READ COMMITTED:只能读取已提交的数据,避免脏读
- REPEATABLE READ:确保在同一事务中多次读取同一数据结果一致(MySQL 默认)
- SERIALIZABLE:最高隔离级别,完全串行化事务,避免幻读
升级事务隔离级别
要将事务隔离级别“升级”到更强的保护(例如从 REPEATABLE READ 到 SERIALIZABLE),可以使用如下命令:
1. 设置当前会话的隔离级别:
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;该设置只影响当前连接,其他会话不受影响。
2. 设置全局隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;新连接将会继承这个设置,但当前已存在的会话不会改变。
常见升级场景是从 READ COMMITTED 或 REPEATABLE READ 升级到 SERIALIZABLE 来防止幻读问题。
在代码中动态设置隔离级别
你也可以在应用程序中执行 SQL 来临时提升隔离级别:
START TRANSACTION; SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 执行敏感操作 SELECT * FROM accounts WHERE user_id = 1; -- 其他操作... COMMIT;这种方式适用于需要高一致性的关键事务。
注意:SET TRANSACTION ISOLATION LEVEL 必须在事务开始前调用,且仅对下一个事务生效(除非再次设置)。
基本上就这些。升级隔离级别能增强数据一致性,但可能降低并发性能,尤其是 SERIALIZABLE 会加范围锁,容易导致锁等待。建议根据业务需求权衡选择。不复杂但容易忽略的是:改全局设置后要重启已有连接才生效。










