mysql事务提交需显式开启事务后执行COMMIT才生效;默认autocommit=1时单条语句自动提交,COMMIT无效;推荐用START TRANSACTION显式开启事务,确保DML操作在COMMIT前执行。

MySQL 中事务提交用 COMMIT 命令,必须在显式开启事务后执行才生效。 默认情况下 MySQL 处于自动提交模式(autocommit=1),单条 SQL 语句会立即持久化,此时 COMMIT 不起作用。要使用事务控制,需先关闭自动提交或用 BEGIN/START TRANSACTION 显式开启事务。
确认当前 autocommit 状态
执行以下命令查看是否处于自动提交模式:
SELECT @@autocommit;
返回 1 表示开启(默认),0 表示关闭。若为 1,后续的 COMMIT 或 ROLLBACK 对单独语句无效。
显式开启事务并提交
推荐方式:不依赖 autocommit 设置,统一用显式事务块:
BEGIN; -- 或 START TRANSACTION; INSERT INTO users(name) VALUES('Alice'); UPDATE accounts SET balance = balance - 100 WHERE id = 1; COMMIT;
-
BEGIN和START TRANSACTION效果相同,建议用后者更标准 - 所有 DML 操作(
INSERT/UPDATE/delete)必须在COMMIT前执行 - 执行
COMMIT后,修改永久写入磁盘,不可回滚
临时关闭 autocommit 并手动提交
适用于需要连续多组事务操作的场景:
SET autocommit = 0; INSERT INTO logs(msg) VALUES('start'); UPDATE config SET value = 'on' WHERE key = 'status'; COMMIT; -- 必须显式提交 SET autocommit = 1; -- 恢复默认
- 设为
0后,每条 DML 都处于未提交状态,直到遇到COMMIT或ROLLBACK - 连接断开或异常终止时,未提交的更改会自动回滚
- 不建议长期保持
autocommit=0,容易遗忘提交导致锁表或数据不一致
提交失败的常见原因
COMMIT 本身极少报错,但可能因前置操作失败而无法达到预期效果:
- 事务中某条语句报错(如主键冲突、外键约束失败),未捕获就直接
COMMIT→ 实际只提交了前面成功的语句(非全部原子性) - 使用了不支持事务的存储引擎(如 MyISAM),
COMMIT无效果 - 在存储过程中未启用事务上下文,或嵌套事务处理不当
确保表使用 InnoDB 引擎,并在应用层或存储过程中配合错误处理逻辑,必要时用 ROLLBACK 补救。