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

验证 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_TRX\G
可看到 trx_state(RUNNING / LOCK WAIT)、trx_started、trx_query 等字段 - 配合锁视图定位冲突:
SELECT * FROM information_schema.INNODB_LOCK_WAITS;










