mysql如何提交事务_mysql事务提交操作说明

来源:这里教程网 时间:2026-02-28 20:31:05 作者:

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
补救。

相关推荐