0

0

mysql中存储引擎的自动提交与事务管理

P粉602998670

P粉602998670

发布时间:2026-01-21 02:43:21

|

780人浏览过

|

来源于php中文网

原创

mysql 默认 autocommit 是开启的,即每条 dml 语句自动提交,仅 start transaction 后才进入事务;innodb 支持完整事务,myisam 不支持;ddl 总是隐式提交,会中断当前事务。

mysql中存储引擎的自动提交与事务管理

MySQL 默认的 autocommit 行为到底开没开?

绝大多数 MySQL 客户端(包括 mysql 命令行、Navicat、DBeaver)连接成功后,autocommit 默认是开启的。你可以用 SELECT @@autocommit; 确认——返回 1 就表示自动提交已启用。

这意味着:每条 INSERTUPDATEDELETE 语句执行完就立刻持久化,不依赖 COMMIT,也无法用 ROLLBACK 撤销。

  • 只有显式执行 START TRANSACTIONBEGIN 后,才进入事务上下文,autocommit 临时失效
  • SET autocommit = 0; 可全局关闭当前会话的自动提交,但不推荐长期使用——容易忘记恢复,导致后续所有 DML 都滞留在未提交状态
  • DDL 语句(如 CREATE TABLEALTER TABLE)无论 autocommit 如何,都会隐式触发 COMMIT

InnoDB 和 MyISAM 对事务的支持差异

存储引擎决定你能不能真正用上事务。InnoDB 支持完整的 ACID 事务、行级锁和外键;MyISAM 完全不支持事务,也没有 ROLLBACK 能力——哪怕你写了 START TRANSACTION,执行 ROLLBACK 也什么都不会发生。

检查表引擎用:SHOW CREATE TABLE table_name;SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name';

  • 创建表时没指定 ENGINE=InnoDB,MySQL 8.0+ 默认用 InnoDB,但老版本或某些配置下可能 fallback 到 MyISAM
  • ALTER TABLE t ENGINE=InnoDB; 可在线转换(MySQL 5.6+),但大表会锁写,且需足够磁盘空间做重建
  • 如果误用了 MyISAM 表却写了事务逻辑,ROLLBACK 不报错但也不起作用——这是最隐蔽的“事务失效”场景

事务中混合 DML 与 DDL 的陷阱

START TRANSACTION 内执行 DDL(比如 ALTER TABLE),MySQL 会**立即隐式提交当前事务**,然后执行 DDL,再开启新事务(如果后续还有 DML)。

商务通(在线客服系统)
商务通(在线客服系统)

一款无需安装的即时交流系统,只需申请一个帐号,将一段代码嵌入贵站网页中,就可以让客服人员发现所有到达您网站的访客,而且可以看到访客的来源、使用的搜索引擎等,您可以主动发起对话与访客沟通,进行产品推销,从而大大提高产品销售成功率。 还是一款协同管理软件,在保持与客户信息通畅的同时,也保持公司内部之间的信息交流,从而提高企业的工作效率和客户服务质量。 管理员帐号:biiz.cn 密码:biiz.cn

下载

这意味着:

  • DDL 前的 DML 已经不可回滚
  • DDL 后的 DML 属于另一个事务,ROLLBACK 只能撤掉它,不影响前面已提交的部分
  • 这个行为在所有存储引擎中一致,和 autocommit 设置无关
START TRANSACTION;
INSERT INTO users (name) VALUES ('alice');
ALTER TABLE users ADD COLUMN age INT;  -- 此刻 INSERT 已提交
INSERT INTO users (name) VALUES ('bob');  -- 这条可被 ROLLBACK
ROLLBACK;  -- 只撤销第二条 INSERT,'alice' 仍存在

应用层连接池里 autocommit 的常见误设

Java 的 HikariCP、Python 的 PyMySQL、Node.jsmysql2 等客户端库,通常默认将连接的 autocommit 设为 true。但有些框架(如旧版 Django)或自定义封装会改成 false,导致连接复用时事务状态“污染”。

典型表现:A 请求手动 begin + commit,B 请求复用同一连接但没显式开启事务,结果 B 的单条 UPDATE 却被卡在未提交状态,直到连接关闭或超时回滚。

  • 最佳实践:不在连接池层面统一关 autocommit,而是由业务逻辑按需控制——用 connection.begin() / start_transaction() 显式开启
  • 务必确认 ORM 或驱动是否在 execute() 前自动加了 START TRANSACTION(例如 SQLAlchemy 的 connection.execute(...) 默认不启事务,但 session.add() 会绑定到 session 级事务)
  • 监控 information_schema.INNODB_TRX 表,查长时间未提交的 trx_state = 'RUNNING' 事务,往往是连接池 + autocommit 配置混乱的直接证据

事务真正的复杂点不在语法,而在跨语句、跨连接、跨引擎的状态一致性。尤其当 DDL 插入事务中间,或连接被复用却未重置 autocommit 时,问题往往延迟暴露,排查成本远高于预防。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

686

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

513

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

287

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

267

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

542

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

667

2023.08.14

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 847人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号