PL/SQL - 事务:初学者指南

你好,未来的数据库法师们!今天,我们将踏上一段激动人心的旅程,探索PL/SQL事务的世界。别担心如果你是编程新手;我将作为你的友好向导,一步一步地解释一切。那么,让我们开始吧!

PL/SQL - Transactions

什么是事务?

在我们开始之前,让我们先了解什么是事务。想象你正在将钱从你的储蓄账户转移到你的支票账户。这个操作涉及两个步骤:

  1. 从储蓄账户中扣钱
  2. 向支票账户中加钱

这两个步骤合在一起形成一个事务。关键是这两个步骤要么都发生,要么都不发生。我们可不希望钱凭空消失或出现!

开始和结束事务

在PL/SQL中,当你执行第一个DML(数据操作语言)语句时,事务会自动开始。这些包括INSERT、UPDATE和DELETE操作。让我们来看一个例子:

BEGIN
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (1001, 'John', 'Doe');

UPDATE employees
SET salary = 50000
WHERE employee_id = 1001;
END;
/

在这个例子中,一旦INSERT语句被执行,事务就开始了。事务会随着UPDATE语句的执行继续进行。

提交事务

现在,你可能想知道,“好吧,我们开始了一个事务,但怎么结束它?”这是个好问题!我们使用COMMIT语句来结束事务并使所有更改永久化。让我们修改一下之前的例子:

BEGIN
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (1001, 'John', 'Doe');

UPDATE employees
SET salary = 50000
WHERE employee_id = 1001;

COMMIT;
END;
/

通过在末尾添加COMMIT语句,我们告诉数据库,“是的,我对这些更改有信心。请使它们永久化。”

为什么提交很重要

想象你正在烤蛋糕。你已经混合了所有的原料,但直到你把它放进烤箱,它还不是真正的蛋糕。同样地,直到你提交你的事务,数据库中的更改都不是永久性的。

回滚事务

有时,事情并不如计划那样进行。也许你意识到你在事务中犯了一个错误。别慌!PL/SQL为我们提供了一个安全网,叫做ROLLBACK。它就像数据库操作的“撤销”按钮。

BEGIN
UPDATE employees
SET salary = salary * 2;  -- 哎呀!我们并不想给每个人的薪水都翻倍!

ROLLBACK;  -- 哇!危机解除。
END;
/

在这个例子中,我们意外地给每个人的薪水都翻倍了(那不是很好吗?)。但多亏了ROLLBACK,我们可以在更改变得永久之前撤销这个更改。

自动事务控制

PL/SQL还在某些情况下提供了自动事务控制。让我们看看这些场景的表格:

场景 操作
PL/SQL块的正常结束 自动COMMIT
事务中的运行时错误 自动ROLLBACK
SQL*Plus EXIT命令(没有COMMIT) 自动ROLLBACK
系统崩溃 自动ROLLBACK

自动回滚的例子

BEGIN
UPDATE employees
SET salary = salary / 0;  -- 哎呀!除以零错误
END;
/

在这种情况下,由于运行时错误,PL/SQL将自动回滚事务。

保存点:在事务中创建检查点

有时,你可能想要回滚事务的一部分,而不是全部。这时,保存点就派上用场了。它们就像视频游戏中的检查点——如果事情出错,你可以返回到它们。

BEGIN
INSERT INTO employees (employee_id, first_name, last_name)
VALUES (1002, 'Jane', 'Smith');

SAVEPOINT after_insert;

UPDATE employees
SET salary = 60000
WHERE employee_id = 1002;

-- 哎呀,我们改变了关于薪水的想法
ROLLBACK TO after_insert;

COMMIT;
END;
/

在这个例子中,我们插入了一个新员工并创建了一个保存点。然后我们更新了薪水,但决定回滚到保存点,撤销薪水更新但保留插入。

使用事务的最佳实践

  1. 保持事务简短:长时间运行的事务可能会锁定资源并影响系统性能。
  2. 使用显式的COMMIT语句:尽管PL/SQL可以在某些情况下自动提交,但最好明确指出何时你想提交你的更改。
  3. 正确处理异常:确保包含适当的异常处理,以避免意外的提交或回滚。
  4. 在复杂事务中使用保存点:如果你有一个长事务,考虑使用保存点来进行部分回滚。

结论

好了,各位!我们已经穿越了PL/SQL事务的土地,从开始和结束它们,到提交和回滚,甚至创建保存点。记住,事务就像是数据库操作的安全带——它们确保你的数据保持一致和可靠。

练习这些概念,尝试不同的场景,很快你就能像专业人士一样管理事务了。快乐编码,愿你的事务总是ACID(那是数据库的笑话,改天再讲)!

Credits: Image by storyset