MySQL事务需显式开启(START TRANSACTION)并配合COMMIT/ROLLBACK,前提是非自动提交模式(autocommit=0);即使autocommit=1,BEGIN仍可启动事务块;DDL会隐式提交,事务不跨连接,隔离级别影响可见性,长事务应避免。

MySQL 中开启事务,核心是用 START TRANSACTION(或 BEGIN)显式启动,再配合 COMMIT 或 ROLLBACK 控制提交或回滚。默认情况下,MySQL 处于自动提交模式(autocommit=1),每条 SQL 语句都会立即生效,此时事务不起作用——必须先关闭自动提交或显式开启事务。
确认并设置 autocommit 状态
事务生效的前提是当前会话不处于自动提交模式。可通过以下方式检查和调整:
- 查看当前 autocommit 值:SELECT @@autocommit; —— 返回 1 表示开启,0 表示关闭
- 临时关闭自动提交:SET autocommit = 0;(当前会话有效)
- 开启自动提交:SET autocommit = 1;
注意:即使 autocommit=1,仍可用 BEGIN 或 START TRANSACTION 显式开启事务块,该事务内的语句仍受 COMMIT/ROLLBACK 控制。
标准事务操作流程
一个完整、安全的事务应包含明确的起点、执行逻辑和终点处理:
从一个Perl爱好者到一个Perl程序员。《Intermediate Perl》将教您如何把Perl作为编程语言来使用,而不仅只是作为一种脚本语言。 Perl是一种灵活多变、功能强大的编程语言,可以应用在从系统管理到网络编程再到数据库操作等很多方面。人们常说Perl让容易的事情变简单、让困难的事情变得可行。《Intermediate Perl》正是关于如何将技能从处理简单任务跃升到胜任困难任务的书籍。 本书提供对Perl中级编程优雅而仔细的介绍。由畅销的《学习Perl》作者所著,本书提供了《学习P
- 显式开启:START TRANSACTION;(推荐)或 BEGIN;
- 执行多条相关 DML 操作(如 INSERT/UPDATE/DELETE),中间可加业务逻辑判断
- 全部成功则提交:COMMIT;
- 任一环节出错或需撤销,则回滚:ROLLBACK;
例如转账场景:
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
若第二条 UPDATE 失败(如主键冲突、字段超长),应手动执行 ROLLBACK 恢复原状。
事务中的常见注意事项
- DDL 语句会隐式提交:CREATE、ALTER、DROP 等操作执行后,会自动触发 COMMIT,导致之前未提交的事务立即结束
- 不能跨连接共享事务:事务只在当前数据库连接(session)中有效,其他连接看不到未提交的修改(符合隔离性)
- 锁与隔离级别影响行为:不同隔离级别(READ COMMITTED、REPEATABLE READ 等)会影响事务间可见性和锁范围,必要时用 SET TRANSACTION ISOLATION LEVEL ... 调整
- 避免长事务:长时间未提交的事务会占用资源、阻塞其他操作,也增加回滚开销
简单验证事务是否生效的小技巧
在命令行或客户端中快速测试:
- 新开两个窗口,都连同一数据库
- 窗口 A 执行:START TRANSACTION; UPDATE t SET v=99 WHERE id=1;(不 COMMIT)
- 窗口 B 执行:SELECT v FROM t WHERE id=1; —— 若看到旧值,说明事务隔离生效
- 窗口 A 再执行 COMMIT;,窗口 B 刷新查询即可看到新值
这样能直观理解事务的原子性和隔离性。









