MySQL 如何查看事务隔离级别?

发布于:2025-09-12 ⋅ 阅读:(15) ⋅ 点赞:(0)

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 的事务隔离级别设置。


网站公告

今日签到

点亮在社区的每一天
去签到