在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,避免不必要的锁竞争。
