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 控制。
标准事务操作流程
一个完整、安全的事务应包含明确的起点、执行逻辑和终点处理:
- 显式开启: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 刷新查询即可看到新值
这样能直观理解事务的原子性和隔离性。