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 NULL
  AND 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.connector

db = 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])

八、最佳实践建议

  1. ​​生产环境推荐​​:使用默认的 REPEATABLE READ 隔离级别
  2. ​​高并发场景​​:考虑使用 READ COMMITTED 减少锁竞争
  3. ​​关键金融操作​​:使用 SERIALIZABLE 保证绝对一致性
  4. ​​监控变更​​:记录隔离级别修改历史
    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
    BEGIN
      IF NEW.VARIABLE_NAME = 'transaction_isolation' THEN
        INSERT INTO isolation_level_changes (old_level, new_level, user)
        VALUES (OLD.VARIABLE_VALUE, NEW.VARIABLE_VALUE, CURRENT_USER());
      END IF;
    END;

九、常见问题排查

问题:为什么修改隔离级别不生效?

​​解决方案​​:

  1. 确认使用 SESSION 作用域修改当前会话
  2. 检查是否有活动事务未提交
  3. 验证用户是否有足够权限

问题:不同会话显示不同隔离级别?

​​原因​​:

  • 会话级别的设置会覆盖全局设置
  • 连接池可能保持不同配置的连接

​​检查​​:

SELECT t.processlist_id, 
       v.VARIABLE_VALUE 
FROM performance_schema.threads t
JOIN performance_schema.variables_by_thread v
  ON v.THREAD_ID = t.THREAD_ID
WHERE v.VARIABLE_NAME = 'transaction_isolation';

通过以上方法,可以全面了解和管理 MySQL 的事务隔离级别设置。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐