ALTER TABLE 会悄悄提交你的事务
BEGIN;
UPDATE d SET v = 100 WHERE id = 1;
ALTER TABLE d ADD COLUMN extra INT;
ROLLBACK;
SELECT v FROM d WHERE id = 1; -- 100,UPDATE 没被回滚DDL 执行前会先隐式提交当前事务,执行完自己也会提交。所以 ROLLBACK 时已经没有可回滚的东西了。
MySQL 的 DDL 不能放在事务里回滚。改表结构前,先把手上的事务处理干净。