MySQL支持设置事务隔离级别以控制并发行为,常用级别包括读未提交、读已提交、可重复读和串行化;可通过SELECT @@global.transaction_isolation和SELECT @@session.transaction_isolation查看当前级别;使用SET GLOBAL transaction_isolation = 'LEVEL'设置全局级别,影响新会话;使用SET SESSION transaction_isolation = 'LEVEL'设置当前会话级别;也可在事务前用SET TRANSACTION ISOLATION LEVEL LEVEL指定下一个事务的隔离级别,需在START TRANSACTION前执行;MySQL默认为REPEATABLE READ,生产环境推荐使用REPEATABLE READ或READ COMMITTED以平衡一致性与性能。

在MySQL中设置事务隔离级别,可以通过全局或会话级别进行配置。不同的隔离级别可以控制并发事务之间的可见性和影响,避免脏读、不可重复读和幻读等问题。常用的隔离级别有:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化(SERIALIZABLE)。
查看当前事务隔离级别
要确认当前的隔离级别,可以使用以下命令:
SELECT @@global.transaction_isolation; -- 查看全局隔离级别 SELECT @@session.transaction_isolation; -- 查看当前会话隔离级别 -- 或者在旧版本中使用: SELECT @@global.tx_isolation; SELECT @@session.tx_isolation;
设置全局事务隔离级别
全局设置会影响所有后续新建立的会话,不会影响当前已存在的会话。
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
也可以使用等价写法:
SET GLOBAL tx_isolation = 'READ-COMMITTED';
支持的值包括:
- READ-UNCOMMITTED – 可以读到未提交的数据变更
- READ-COMMITTED – 只能读到已提交的数据
- REPEATABLE-READ – MySQL默认级别,确保在同一事务中多次读取同一数据结果一致
- SERIALIZABLE – 完全串行化事务执行,避免幻读
设置会话事务隔离级别
仅对当前会话有效,不影响其他连接。
SET SESSION transaction_isolation = 'READ-COMMITTED';
例如,在当前会话中临时改为读已提交模式:
SET SESSION transaction_isolation = 'READ-COMMITTED'; START TRANSACTION; -- 执行查询或更新操作 COMMIT;
在事务中动态设置隔离级别
可以在开启事务前指定其隔离级别:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; START TRANSACTION; -- 后续操作将使用指定的隔离级别
注意:这条语句必须在START TRANSACTION之前执行,并且只对下一个事务生效(除非再次设置)。
基本上就这些。根据应用的并发需求选择合适的隔离级别,权衡一致性与性能。生产环境推荐使用REPEATABLE READ或READ COMMITTED,避免不必要的锁竞争。










