SQL 中的 COMMIT 和 ROLLBACK 详解

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. 最佳实践

  1. 事务应尽量短小:减少锁定资源的时间

  2. 明确的事务边界:清晰定义开始和结束

  3. 异常处理:在应用程序中捕获异常并执行ROLLBACK

  4. 避免嵌套事务:不同数据库对嵌套事务的支持不一致

  5. 合理使用保存点:处理复杂事务中的部分回滚

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是保证数据一致性的关键机制,合理使用它们可以确保数据库操作的安全性和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值