查XAMPP中MySQL当前隔离级别:执行SELECT @@transaction_isolation;(MySQL 8.0+)或SELECT @@tx_isolation;(5.7及以前);查全局默认值用SELECT @@global.transaction_isolation;。

怎么查 XAMPP 里 MySQL 当前的隔离级别
XAMPP 自带的 MySQL 默认是 REPEATABLE-READ,但不能光靠“默认”来判断——实际值可能被配置文件、启动参数或运行时命令改过。最直接的办法是在 phpMyAdmin 或命令行里执行:
SELECT @@transaction_isolation;
如果用的是 MySQL 5.7 或更早版本,得换成:
SELECT @@tx_isolation;
想看全局默认值(即新连接会继承的级别),加 @@global. 前缀:
SELECT @@global.transaction_isolation;
注意:XAMPP 的 MySQL 进程一旦启动,@@global 值就固定了,除非重启服务或改配置再重载。
修改 XAMPP MySQL 的配置文件(永久生效)
XAMPP 的 MySQL 配置文件路径通常是 XAMPP\mysql\bin\my.ini(Windows)或 /Applications/XAMPP/xamppfiles/etc/my.cnf(macOS)。别去动 my-default.ini 或其他备份文件,那些不生效。
打开 my.ini,在 [mysqld] 段落末尾添加一行:
transaction-isolation = 'READ-COMMITTED'
必须用短横线 -,不能写成下划线 _;推荐加单引号,避免某些版本解析失败;大小写不敏感,但全大写更稳妥。
- 改完保存,必须重启 XAMPP 的 MySQL 服务(不是整个 Apache)才能加载新配置
- 如果只是编辑了文件但没重启,
SELECT @@global.transaction_isolation仍显示旧值 - 用
kill -9强杀 MySQL 进程后重启,可能导致配置未正确重载,建议通过 XAMPP 控制面板操作
临时修改当前连接的隔离级别(无需重启)
在 phpMyAdmin 的 SQL 标签页、MySQL 命令行或任何客户端里执行即可,只影响当前会话:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
这条命令在事务开始前执行才有效;如果已经 START TRANSACTION 或有未提交语句,部分客户端可能报错或静默忽略。
- 常见误操作:在 Spring Boot 应用里设了
@Transactional(isolation = Isolation.READ_COMMITTED),但忘了 XAMPP MySQL 实际没开这个级别,结果发现行为还是REPEATABLE-READ—— 因为 Spring 会尝试 SET SESSION,但如果 MySQL 用户权限不足或变量被禁用,会静默回退到默认值 - 验证是否生效:执行完 SET 后立刻查
SELECT @@transaction_isolation,别依赖后续 SELECT 的表现来反推
为什么 SET GLOBAL 不起作用?
在 XAMPP 环境下执行:
SET GLOBAL transaction_isolation = 'READ-COMMITTED';
看起来成功,但新起一个连接还是旧级别?问题出在权限和持久性上:
- MySQL root 用户默认有
SYSTEM_VARIABLES_ADMIN权限,但 XAMPP 的 root 可能没显式赋权,需确认:SHOW GRANTS FOR 'root'@'localhost'; -
SET GLOBAL只影响之后新建的连接,已存在的连接(包括你当前这个)继续用旧值 - 该设置不写入配置文件,MySQL 重启后丢失 —— 所以它在 XAMPP 这种本地开发环境里实用性很低,不如直接改
my.ini
真正容易被忽略的是:XAMPP 控制面板里“Shell”按钮打开的命令行,默认连接的是 127.0.0.1:3306,但有些版本会默认走 socket 连接,导致 SET GLOBAL 在某些上下文里被限制。最稳的方式,永远是改配置 + 重启服务。


















