能,但需满足事务显式开启、autocommit关闭、使用InnoDB引擎、同连接操作且无隐式提交;否则ROLLBACK无效。
能,但前提是事务必须在 START TRANSACTION 或 BEGIN 之后、COMMIT 之前显式执行 ROLLBACK,且所有操作都在同一个事务上下文中。MySQL 默认的 AUTOCOMMIT=1 模式下,单条语句自动提交,此时 ROLLBACK 无效——这是最常被忽略的前提。
SELECT @@autocommit;,返回 1 表示开启自动提交SET autocommit = 0; 后,后续语句才进入事务边界CREATE TABLE、ALTER TABLE)会隐式触发 COMMIT,导致之前未提交的 DML 回滚失效INSERT 和 UPDATE 不受彼此事务影响常见于误判“已入事务”或混淆存储引擎行为。InnoDB 支持完整事务,MyISAM 完全不支持事务——哪怕写了 BEGIN 和 ROLLBACK,MyISAM 表的数据也早已落盘。
SHOW CREATE TABLE user_info; 查看输出中是否含 ENGINE=InnoDB
ROLLBACK 后立刻查表,若数据仍在,先检查是否在 AUTOCOMMIT=1 下执行了单条语句SELECT ... FOR UPDATE 或 LOCK IN SHARE MODE 时,若事务未提交就断开连接,MySQL 会自动回滚并释放锁,但客户端可能误以为“已生效”SIGNAL SQLSTATE '45000')可中断事务,但需确保触发器本身在事务内被调用,而非独立执行不能只依赖“没报错”,要观察数据状态和事务 ID 变化。InnoDB 的 INFORMATION_SCHEMA.INNODB_TRX 表可实时反映活跃事务,配合 SELECT 查询比对最可靠。
START TRANSACTION;
INSERT INTO user_info (name, balance) VALUES ('alice', 100);
SELECT * FROM user_info WHERE name = 'alice'; -- 能查到新记录
SELECT trx_id, trx_state FROM INFORMATION_SCHEMA.INNODB_TRX
WHERE trx_mysql_thread_id = CONNECTION_ID(); -- 显示 active 状态
ROLLBACK;
SELECT * FROM user_info WHERE name = 'alice'; -- 应返回空结果
SELECT trx_id FROM INFORMATION_SCHEMA.INNODB_TRX
WHERE trx_mysql_thread_id = CONNECTION_ID(); -- 应无结果ROLLBACK 成功后,INFORMATION_SCHEMA.INNODB_TRX 中对应线程的记录消失ROLLBACK 未执行或执行失败(例如语法错误、权限不足)SHOW PROCESSLIST 判断,它不显示事务状态,只显示连接命令有,但保障范围仅限于本事务内的修改。InnoDB 的 MVCC 机制让其他事务看到的是快照,不会因你的 ROLLBACK 导致它们读到“中间态”。不过,若多个事务竞争同一行,回滚前的锁等待可能引发超时或死锁,进而影响整体一致性达成时机。
Deadlock found when trying to get lock 后必须重试逻辑,不能假设 ROLLBACK 就万事大吉SELECT ... FOR UPDATE 在事务中加锁,若另一事务已持有锁且未提交,当前事务会阻塞;此时 ROLLBACK 只释放本事务锁,不解除对方阻塞ROLLBACK 执行缓慢甚至失败(如磁盘满、超时),
事务真正落地前,任何“看起来回滚了”的判断都得靠查数据+查 INNODB_TRX 双验证。引擎、autocommit、连接隔离、锁状态——少盯住一个,就容易以为一致,其实已经偏移。