CodeGym /课程 /SQL SELF /事务操作的基本命令: BEGINCOMMIT

事务操作的基本命令: BEGINCOMMITROLLBACK

SQL SELF
第 39 级, 课程 1
可用

为了让你数据库里的所有变更都在掌控之中并且能正确执行,PostgreSQL用到了事务的概念。事务就是一组SQL操作,要么全做,要么全不做。如果中间出错了,所有变更都得撤回。这时候BEGINCOMMITROLLBACK这些命令就派上用场了。

事务命令可不是为了好看——它们在防止数据出错和崩溃时起着关键作用。当你执行一连串SQL操作时,必须保证一切都能顺利完成:如果有一步失败,数据库就得回到原来的状态。这就是事务命令存在的主要原因之一——它们帮你保证数据一致性。

另外,事务还能保证所谓的原子性:要么所有变更一起生效,要么一个都不生效。这样就不会出现数据库“只改了一半”的情况——比如钱扣了但商品没加进订单里。

当然,事务还很灵活。你可以设计很复杂的操作链,自己决定什么时候用COMMIT提交,什么时候用ROLLBACK撤销,甚至还能用SAVEPOINT做局部回滚。这让数据库操作既安全又可控。

BEGIN命令

BEGIN命令告诉PostgreSQL事务要开始了。执行完它后,你做的所有变更都会处于“悬挂”状态,直到你用COMMIT提交或者用ROLLBACK撤销。

举个经典例子:假如你想把100块钱从一个账户转到另一个账户。你用BEGIN开启事务:

BEGIN;
-- 开始事务
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 账户1余额减100
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- 账户2余额加100
注意:

只要你还在事务里操作,其他数据库用户是看不到你这些变更的。只有执行了COMMIT之后,大家才能看到。

COMMIT命令

COMMIT命令用来结束事务,把你在事务里做的所有变更都保存到数据库里。执行完这条命令后,所有用户都能看到这些变更。

事务提交的例子:

COMMIT;
-- 事务里的所有变更都保存了

现在,刚才我们例子里的余额变更就“永久”生效了。钱已经成功转账。

ROLLBACK命令

如果你在事务执行过程中发现有问题,或者想撤销变更,可以用ROLLBACK命令。它会撤销自BEGIN以来的所有操作。

比如,转账过程中你发现账户余额不够。这时候就要回滚事务:

BEGIN;
-- 开始事务
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;

-- 哎呀,出错了:余额不足。
ROLLBACK;
-- 所有变更都撤销了,数据库回到原来的状态

执行ROLLBACK后,数据库里的变更都不会被保存。这对于防止出错特别有用。

完整例子:账户间转账

我们把所有东西串起来。下面是一个完整的事务例子——包含余额检查、转账和出错时的回滚:

BEGIN;
-- 开始事务

-- 检查账户余额
SELECT balance INTO current_balance FROM accounts WHERE account_id = 1;

-- 检查余额是否足够
IF current_balance >= 100 THEN
    -- 如果余额足够,执行转账
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
    COMMIT;
    -- 确认变更
ELSE
    -- 如果余额不足,撤销事务
    ROLLBACK;
END IF;

这个例子展示了事务命令如何协作,防止数据不一致。

注意

IF THEN ELSE END IF——这是存储过程里的操作,我们后面几节会详细讲:P

自动提交(auto-commit)设置的特点

PostgreSQL默认开启了自动提交模式,所以你在没有显式事务的情况下执行命令,变更会立刻写进数据库。比如:

UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 变更立刻保存了,哪怕没有COMMIT

如果你想手动管理事务,建议每次都用BEGIN显式开启事务。

你可以用下面的命令关闭当前会话的自动提交:

SET AUTOCOMMIT TO OFF;

记住:如果关掉了自动提交,每次都得用COMMITROLLBACK结束会话。

事务操作常见错误

漏掉COMMIT 如果你忘了执行COMMIT,你的变更就会一直处于未完成状态,等会话结束后就丢了。

锁表。 只要事务没结束,它用到的资源就会被锁住。这可能导致并发访问数据时出问题。

多余的ROLLBACK 有时候程序员太谨慎,没必要也回滚事务。这样会导致重复计算,加重数据库负担。

悬挂事务。 如果你开启了事务但忘了结束(既没COMMIT也没ROLLBACK),会话就会卡住,数据库资源也被锁死。

实际应用

面试开发或者DBA(数据库管理员)岗位时,经常会被问到PostgreSQL事务实现。你对BEGINCOMMITROLLBACK命令的理解,能体现你安全高效地操作数据的能力。

实际工作中,事务特别适合用来构建可靠的系统,比如电商订单处理、积分奖励系统等。

现在你已经搞懂了事务的基本命令,我们可以继续深入,比如怎么用SAVEPOINT,还有事务隔离级别的玩法。PostgreSQL的世界很大,慢慢玩吧。

2
任务
SQL SELF, 第 39 级, 课程 1
已锁定
简单的事务提交
简单的事务提交
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION