如何验证事务是否生效_mysql事务测试方法

10次阅读

验证 MySQL 事务是否生效,需依次检验隔离性(未提交数据对其他会话不可见)、原子性(ROLLBACK 后数据恢复原状)、autocommit 状态(避免自动提交干扰),并可借助 INNODB_TRX 等视图观察事务运行状态。

如何验证事务是否生效_mysql 事务测试方法

验证 MySQL 事务是否生效,关键在于观察事务的 原子性、一致性、隔离性、持久性(ACID)是否被正确体现,尤其要确认回滚(ROLLBACK)和提交(COMMIT)是否按预期影响数据。最直接有效的方式是结合手动操作与查询验证,在会话级控制事务并实时检查数据状态。

1. 使用 START TRANSACTION + SELECT 验证未提交数据不可见

在事务中修改数据后,不提交,另开一个新连接(或新会话)查询同一行,应看不到变更——这是验证隔离性的核心方法。

  • 会话 A 执行:
    START TRANSACTION;
    UPDATE accounts SET balance = 1000 WHERE id = 1;

    (此时不执行 COMMIT 或 ROLLBACK)
  • 会话 B 执行:
    SELECT balance FROM accounts WHERE id = 1;
    返回原值(如 500),说明修改尚未持久化,其他事务不可见。

2. 用 ROLLBACK 回滚后查数据是否恢复

这是检验事务原子性和可撤销性的最常用测试点。修改后主动回滚,再查数据必须回到事务开始前的状态。

  • 执行:
    START TRANSACTION;
    INSERT INTO logs (msg) VALUES (‘test’);
    DELETE FROM users WHERE id = 999;
    ROLLBACK;
  • 紧接着执行:
    SELECT COUNT(*) FROM logs WHERE msg = ‘test’;
    SELECT * FROM users WHERE id = 999;

    应分别返回 0 和原始记录(若存在),证明回滚成功。

3. 检查 autocommit 状态避免“假事务”

很多问题源于 autocommit=1(默认开启),导致每条语句自动提交,看似写了 START TRANSACTION 实际没起作用。

  • 先确认当前设置:
    SELECT @@autocommit; → 返回 1 表示自动提交开启
  • 临时关闭(当前会话有效):
    SET autocommit = 0;
    或显式使用 START TRANSACTION; 启动事务(推荐)
  • 测试时务必在同一会话中完成 BEGIN/ 修改 /ROLLBACK/COMMIT 全流程,否则事务上下文已丢失。

4. 利用 INFORMATION_SCHEMA 或 performance_schema 辅助观察(进阶)

适用于调试复杂场景,比如想确认事务是否真正持 有锁 或是否被阻塞:

  • 查看当前活跃事务:
    SELECT * FROM information_schema.INNODB_TRXG
    可看到 trx_state(RUNNING / LOCK WAIT)、trx_started、trx_query 等字段
  • 配合锁视图定位冲突:
    SELECT * FROM information_schema.INNODB_LOCK_WAITS;
text=ZqhQzanResources