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

来源:这里教程网 时间:2026-02-28 20:35:13 作者:

验证 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;

相关推荐