COMMIT
COMMIT 提交事务——把当前事务中所有修改永久保存到数据库,并释放事务锁。
事务是数据库的原子操作单元:要么全部成功,要么全部失败。COMMIT 就是"全部成功"的确认按钮。在 COMMIT 之前,其他会话看不到你的修改,你可以随时 ROLLBACK 撤销。
MySQL 默认开启自动提交(autocommit = 1),每条 SQL 语句都是一个独立事务,执行完自动 COMMIT。要手动控制事务,需要先 SET autocommit = 0,或者用 START TRANSACTION 显式开启。不同数据库开启事务的语法略有差异:MySQL 和 PostgreSQL 用 START TRANSACTION 或 BEGIN,SQL Server 用 BEGIN TRANSACTION,Oracle 用 SET TRANSACTION。
事务遵循 ACID 四个特性:
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。
- 一致性(Consistency):事务执行前后,数据库从一个一致状态转换到另一个一致状态。
- 隔离性(Isolation):多个事务并发执行时,彼此互不干扰。隔离级别从低到高分为
READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE。 - 持久性(Durability):
COMMIT后,修改永久保存,即使系统崩溃也不会丢失。
以飞翔科技为例。转账场景必须用事务:
-- 飞翔科技内部转账:从部门 1 转 1000 元给部门 2
START TRANSACTION;
-- 部门 1 扣款
UPDATE department_budget
SET balance = balance - 1000
WHERE dept_id = 1;
-- 部门 2 收款
UPDATE department_budget
SET balance = balance + 1000
WHERE dept_id = 2;
-- 确认无误,提交
COMMIT;
如果两条 UPDATE 之间程序崩溃,或者 COMMIT 前发现错误,整个事务会回滚,两个部门的余额都不会变。这就是事务的原子性:要么全改,要么全不改。COMMIT 之后,修改对其他会话可见,且无法再回滚。