PostgreSQL 教程: 子事务

十二月 9, 2023

摘要:在本教程中,您将学习如何使用SAVEPOINTROLLBACK TO SAVEPOINTRELEASE SAVEPOINT语句,来处理 PostgreSQL 子事务。

子事务简介

在专业的应用程序中,很难在不遇到任何错误的情况下编写相当长的事务。为了解决这个问题,用户可以使用一种叫做 SAVEPOINT 的东西。顾名思义,保存点是事务中的一个安全位置,如果出现严重错误,应用程序可以返回到该位置。

保存点是一个数据库特性,它允许您在事务中创建命名点,以后可以回滚到该命名点,同时保持事务的其余部分不变。当您想要处理事务中的错误或异常,并有选择地回滚到事务中的特定点,而不必撤消到目前为止所做的所有更改时,保存点非常有用。

怎么工作的

以下是在 PostgreSQL 中使用保存点的方法:

使用BEGIN语句启动一个事务:

BEGIN;

这将开始一个新的事务。

在事务中,您可以使用SAVEPOINT语句创建一个保存点,并指定一个名称:

SAVEPOINT my_savepoint;

在此示例中,在事务中创建了一个名为my_savepoint的保存点。

在事务中执行一个或多个 SQL 操作,例如INSERTUPDATEDELETE等。

在任何时候,如果需要回滚到保存点,可以使用ROLLBACK TO语句:

ROLLBACK TO my_savepoint;

这将撤消在创建my_savepoint保存点后所做的所有更改,从而有效地将事务还原到该点。

您还可以使用RELEASE语句释放保存点:

RELEASE my_savepoint;

这将删除保存点,并允许事务从当前位置继续。

最后,当您准备好提交事务中所做的所有更改时,可以使用COMMIT语句:

COMMIT;

这会将事务中所做的所有更改保存到数据库中。

示例

下面是一个完整的示例:

BEGIN;
-- Perform some operations within the transaction
INSERT INTO employees (name, salary) VALUES ('John', 50000);
SAVEPOINT my_savepoint;
-- Continue with more operations
UPDATE departments SET manager_id = 1 WHERE department_name = 'HR';
-- Something went wrong, let's roll back to the savepoint
ROLLBACK TO my_savepoint;
-- Continue with other operations or release the savepoint
-- RELEASE my_savepoint;
-- Finally, when everything is fine, commit the transaction
COMMIT;

总结

保存点允许您对事务进行更精细的控制,尤其是在复杂的场景中,您希望优雅地处理错误,并有选择地回滚到事务中的特定点的情况下。

事务中的保存点数量实际上是无限的。我们见到过客户在一次操作中拥有超过 250,000 个保存点。PostgreSQL 可以对此进行轻松的处理。

许多人会问,如果您在事务结束后尝试到达保存点会发生什么。答案是,一旦事务结束,保存点的生命周期就结束了。换句话说,在事务完成后,没有办法回到某个时间点。