COMMIT 和 ROLLBACK 是 SQL 事务处理的两个核心命令,用于控制数据库事务的提交和回滚。
1. 基本概念
1.1 事务(Transaction)
-
一系列数据库操作组成的逻辑工作单元
-
具有ACID特性:
-
原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不执行
-
一致性(Consistency):事务使数据库从一个一致状态转变为另一个一致状态
-
隔离性(Isolation):并发事务之间互不干扰
-
持久性(Durability):一旦事务提交,其结果永久有效
-
1.2 COMMIT
-
将当前事务的所有操作永久保存到数据库
-
语法:
COMMIT [WORK]
1.3 ROLLBACK
-
撤销当前事务的所有操作,回滚到事务开始前的状态
-
语法:
ROLLBACK [WORK] [TO [SAVEPOINT] savepoint_name]
2. 使用场景
2.1 典型事务流程
sql
复制
下载
BEGIN TRANSACTION; -- 开始事务(某些数据库可省略) INSERT INTO accounts (id, balance) VALUES (1, 1000); UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 检查业务规则 IF (SELECT balance FROM accounts WHERE id = 1) >= 0 THEN COMMIT; -- 所有操作成功,提交事务 ELSE ROLLBACK; -- 违反业务规则,回滚事务 END IF;
2.2 保存点(SAVEPOINT)
sql
复制
下载
BEGIN; INSERT INTO orders (id, customer_id) VALUES (101, 1); SAVEPOINT order_created; INSERT INTO order_items (order_id, product_id) VALUES (101, 5); -- 假设此处发生错误 ROLLBACK TO order_created; -- 回滚到保存点,保留orders表的插入 COMMIT;
3. 不同数据库的实现
3.1 MySQL/PostgreSQL
sql
复制
下载
START TRANSACTION; -- 操作... COMMIT; -- 或 BEGIN; -- 操作... ROLLBACK;
3.2 Oracle
sql
复制
下载
-- Oracle默认每个语句都是事务,需显式开始 SET TRANSACTION; -- 操作... COMMIT; -- 或 -- 操作... ROLLBACK;
3.3 SQL Server
sql
复制
下载
BEGIN TRANSACTION; -- 操作... COMMIT TRANSACTION; -- 或 BEGIN TRAN; -- 操作... ROLLBACK TRAN;
4. 自动提交模式
大多数数据库默认启用自动提交(autocommit):
-
每个SQL语句被视为独立事务,执行后自动提交
-
可以关闭自动提交:
-
MySQL:
SET autocommit = 0;
-
PostgreSQL:
BEGIN;
开始显式事务 -
SQL Server:
SET IMPLICIT_TRANSACTIONS ON;
-
5. 最佳实践
-
事务应尽量短小:减少锁定资源的时间
-
明确的事务边界:清晰定义开始和结束
-
异常处理:在应用程序中捕获异常并执行ROLLBACK
-
避免嵌套事务:不同数据库对嵌套事务的支持不一致
-
合理使用保存点:处理复杂事务中的部分回滚
6. 实际应用示例
银行转账事务
sql
复制
下载
BEGIN; -- 检查账户余额 DECLARE @balance DECIMAL; SELECT @balance = balance FROM accounts WHERE id = 1; IF @balance >= 100 THEN -- 执行转账 UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; -- 记录交易 INSERT INTO transactions (from_acc, to_acc, amount) VALUES (1, 2, 100); COMMIT; PRINT '转账成功'; ELSE ROLLBACK; PRINT '余额不足'; END IF;
COMMIT和ROLLBACK是保证数据一致性的关键机制,合理使用它们可以确保数据库操作的安全性和可靠性。