MySQL 如何查看事务隔离级别?
MySQL 查看事务隔离级别的完整指南
一、查看当前会话的事务隔离级别
1. 使用系统变量查询(推荐)
-- 查看当前会话的隔离级别
SELECT @@transaction_isolation;-- 或(MySQL 8.0 之前版本)
SELECT @@tx_isolation;
2. 使用系统变量查询(带作用域)
-- 查看全局隔离级别
SELECT @@global.transaction_isolation;-- 查看当前会话隔离级别
SELECT @@session.transaction_isolation;
3. 使用 SHOW VARIABLES 命令
-- 查看当前会话
SHOW VARIABLES LIKE 'transaction_isolation';-- 查看全局设置
SHOW GLOBAL VARIABLES LIKE 'transaction_isolation';
二、查看其他会话的事务隔离级别
1. 通过 PROCESSLIST 和变量关联
SELECT p.ID AS process_id, p.USER, p.DB, p.COMMAND,v.VARIABLE_VALUE AS isolation_level
FROM information_schema.PROCESSLIST p
JOIN performance_schema.variables_by_thread v ON v.THREAD_ID = p.THREAD_ID
WHERE v.VARIABLE_NAME = 'transaction_isolation'AND p.COMMAND = 'Sleep'; -- 过滤空闲连接
2. 使用 sys 系统库(MySQL 5.7+)
SELECT *
FROM sys.session
WHERE conn_id IS NOT NULLAND current_statement IS NULL; -- 查看空闲连接
三、查看默认隔离级别配置
1. 查看配置文件中的设置
SHOW VARIABLES LIKE 'transaction_isolation';
2. 查看启动参数
SELECT *
FROM performance_schema.persisted_variables
WHERE VARIABLE_NAME = 'transaction_isolation';
四、理解不同隔离级别的含义
MySQL 支持四种隔离级别:
隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能影响 |
---|---|---|---|---|
READ UNCOMMITTED | 可能 | 可能 | 可能 | 最低 |
READ COMMITTED | 不可能 | 可能 | 可能 | 低 |
REPEATABLE READ (默认) | 不可能 | 不可能 | 可能 | 中 |
SERIALIZABLE | 不可能 | 不可能 | 不可能 | 高 |
五、修改事务隔离级别
1. 修改当前会话
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
2. 修改全局设置
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
3. 在事务中修改
START TRANSACTION;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 执行事务操作
COMMIT;
六、查看隔离级别相关状态
1. 查看锁等待
SELECT * FROM performance_schema.data_lock_waits;
2. 查看当前锁
SELECT * FROM performance_schema.data_locks;
3. 查看事务状态
SELECT * FROM information_schema.INNODB_TRX;
七、不同客户端的查看方式
1. MySQL 命令行客户端
mysql> SELECT @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ |
+-------------------------+
2. PHP PDO 查看
$pdo = new PDO($dsn, $user, $pass);
$isolation = $pdo->query("SELECT @@transaction_isolation")->fetchColumn();
echo "当前隔离级别: $isolation";
3. Python (MySQL Connector)
import mysql.connectordb = mysql.connector.connect(host="localhost",user="user",password="password",database="mydatabase"
)cursor = db.cursor()
cursor.execute("SELECT @@transaction_isolation")
result = cursor.fetchone()
print("隔离级别:", result[0])
八、最佳实践建议
- 生产环境推荐:使用默认的
REPEATABLE READ
隔离级别 - 高并发场景:考虑使用
READ COMMITTED
减少锁竞争 - 关键金融操作:使用
SERIALIZABLE
保证绝对一致性 - 监控变更:记录隔离级别修改历史
CREATE TABLE isolation_level_changes (id INT AUTO_INCREMENT PRIMARY KEY,changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,old_level VARCHAR(20),new_level VARCHAR(20),user VARCHAR(32) );CREATE TRIGGER after_isolation_change AFTER UPDATE ON performance_schema.session_variables FOR EACH ROW BEGINIF NEW.VARIABLE_NAME = 'transaction_isolation' THENINSERT INTO isolation_level_changes (old_level, new_level, user)VALUES (OLD.VARIABLE_VALUE, NEW.VARIABLE_VALUE, CURRENT_USER());END IF; END;
九、常见问题排查
问题:为什么修改隔离级别不生效?
解决方案:
- 确认使用
SESSION
作用域修改当前会话 - 检查是否有活动事务未提交
- 验证用户是否有足够权限
问题:不同会话显示不同隔离级别?
原因:
- 会话级别的设置会覆盖全局设置
- 连接池可能保持不同配置的连接
检查:
SELECT t.processlist_id, v.VARIABLE_VALUE
FROM performance_schema.threads t
JOIN performance_schema.variables_by_thread vON v.THREAD_ID = t.THREAD_ID
WHERE v.VARIABLE_NAME = 'transaction_isolation';
通过以上方法,可以全面了解和管理 MySQL 的事务隔离级别设置。