mysql在事务中执行DDL的后果_MySQL 8.0之前的限制

MySQL 8.0前ALTER TABLE会隐式提交事务,导致ROLLBACK失效;8.0起部分DDL支持原子性但受限于算法(如INSTANT),DROP DATABASE等仍强制提交;安全做法是DDL与DML物理隔离。MySQL 8.0 之前在事务里执行 ALTER TABLE 会自动提交不是报错,而是悄悄提交当前事务------这是最危险的地方。你写了个 BEGIN,中间夹了条 ALTER TABLE,后面再 ROLLBACK,发现前面的 INSERT 或 UPDATE 全没回滚,因为事务早被 DDL 强制结束了。原因很简单:MySQL 5.7 及更早版本不支持 DDL 的原子性,所有 DDL(CREATE、DROP、ALTER、RENAME)都会触发隐式提交(implicit commit),哪怕你没写 COMMIT。哪怕事务里只有 SELECT + ALTER TABLE,ALTER 执行完,事务状态就变成"已提交"SHOW VARIABLES LIKE 'autocommit' 设为 OFF 也拦不住------DDL 不吃这套如果你依赖事务边界做数据一致性校验(比如先改配置表再改主表),这个隐式提交会让校验完全失效错误现象:为什么 ROLLBACK 像没发生一样典型表现是:执行完 ALTER TABLE 后,再执行 ROLLBACK,命令成功返回,但之前做的 DML 没回滚。这不是 bug,是设计如此。你可以用 SELECT @@in_transaction 验证:在 ALTER 前它是 1,执行后立刻变 0;或者查 information_schema.INNODB_TRX,事务记录已经消失。错误日志里不会报错,也不会警告,安静得可怕应用层如果没检查事务状态,可能误以为整个逻辑块还在一个事务里ORM(如 Django、SQLAlchemy)若自动生成 DDL(比如迁移脚本),更容易踩中这个坑MySQL 8.0+ 的变化:DDL 支持原子性,但仍有条件8.0 引入了原子 DDL 日志(mysql.innodb_ddl_log),让部分 DDL 真正支持事务语义------但仅限于满足条件的操作。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

相关推荐
数据库小学妹3 小时前
MySQL大字段治理:行溢出机制、覆盖索引与拆表
数据库·mysql·性能优化
用户1614840955453 小时前
用 M4 Pro 跑羽毛球视频 AI 分析(二):TrackNet MPS 加速 3.2 倍、卡尔曼滤波补漏与自动回合剪辑
python
用户4019925568613 小时前
基于对话树回溯的社媒评论流买方意图识别与噪音过滤实践
python
爱吃奥利奥_wen3 小时前
SQL Server 基础语法详解:从建库建表到约束与增删改查
服务器·数据库·oracle
用户0332126663673 小时前
使用 Python 加密或解密 PDF 文档
python
小七-七牛开发者4 小时前
让 Go 走得更远:用 LLGo 打通 Go 与 C/C++/Python 生态
python·编程·编译器·llvm·llgo
这个DBA有点耶4 小时前
MySQL 8.0不可见索引:删索引怕出事,不删又拖慢写入——中间态怎么用?
数据库·mysql·代码规范
CyrusYiVPP5 小时前
实测 Ollama 本地部署:我用 Python 搓了个离线问答机器人,Qwen4 27B 一到换个模型名就能用
人工智能·python
2601_967980115 小时前
Python中flatten( )函数及函数用法详解
python·numpy·数组操作·flatten函数·列表处理
测试界的小码农5 小时前
【图数据库实战进阶(01):从零认识 Neo4j,搭建第一个图数据库项目】
数据库·neo4j