【PGCCC】PostgreSQL 保存点

这篇文章将介绍事务中 PostgreSQL 保存点的基础知识。


事务用于形成一个不可分离的工作单元,以作为一个单元来提交或不提交。使用关键字打开事务,然后提交或回滚。不带任何参数即可执行此操作。BEGINROLLBACK。

分割交易

在事务的概念中,有一个较小的单元允许增量持久性,范围限定为事务,称为“保存点”。保存点创建具有与事务相似属性的子事务。

保存点

保存点将事务的特定状态标记为可恢复位置。以类似于回滚整个事务的方式,捕获事务中的一个位置,数据的状态可以恢复到该位置ROLLBACKROLLBACK TO


恢复到保存点后,查询数据将显示其在创建保存点时的状态。

命令

保存点具有需要了解的动词:


  • “Savepoint”可以用作名词或动词,具体取决于上下文。运行命令,其中 a 是保存点的名称,使用“savepoint”作为创建保存点“a”的命令动词。保存点“a”(名词)已创建。SAVEPOINT a

  • 保存点名称可以重复使用,从而创建具有相同名称的新保存点,从而反映数据的新状态。

  • 可以使用命令将保存点回滚到指定命名的保存点 https://www.postgresql.org/docs/current/sql-rollback-to.html  ROLLBACKTO

  • 可以使用该命令“释放”保存点。但是,释放保存点不会更改数据的状态,而这可能会这样做。释放保存点会释放保存点名称,并释放用于创建同一点的资源。阅读更多: https://www.postgresql.org/docs/current/sql-release-savepoint.html   RELEASEROLLBACKTO

让我们看一下用于创建和回滚到保存点的 SQL 命令:

BEGIN;
INSERT INTO vehicles (name) VALUES ('Toyota bZ4X');
SAVEPOINT a;
INSERT INTO vehicles (name) VALUES ('Honda Prologue');
SELECT COUNT(*) FROM vehicles; -- 2
ROLLBACK TO a; -- SELECT COUNT(*) FROM VEHICLES; -- is 1
COMMIT; -- Only one vehicle was saved

可以使用该命令删除保存点。RELEASE


下面是创建和释放保存点的示例:

BEGIN;
INSERT INTO vehicles (name) VALUES ('Toyota bZ4X');
SAVEPOINT a;
RELEASE a;
COMMIT; -- Only one vehicle was saved

在上面的示例中,创建了一个保存点,然后释放了一个保存点,不会影响数据的状态。

重用保存点

保存点名称可以重复使用。这些文档描述了 SQL 标准如何规定在替换时必须删除具有相同名称的保存点。


这是 Postgres 不完全符合 SQL 标准的地方,因为它说在 PostgreSQL 中保存点是保留的。


创建保存点时,事务中的数据状态将在创建时“就在”保存。这可以通过使用命令恢复到保存点来恢复。ROLLBACK TO


当回滚到保存点时,稍后在事务中创建的保存点不再是“已知的”。

错误

当使用同一名称创建多个保存点时(例如三次),也可以根据保存点的数量释放每个保存点的次数。


想象一下,有三个是用名称“a”创建的。在这种情况下,可以对“a”调用三次 release,但在第四次时将产生错误。


当这种错误发生时,外部事务现在也处于错误状态。从那里,外部事务可以回滚。在这种错误状态下,调用也会回滚事务。COMMIT

BEGIN;
SAVEPOINT a;
SAVEPOINT a;
SAVEPOINT a;
RELEASE a;
RELEASE a;
RELEASE a;
RELEASE a; -- ERROR:  savepoint "a" does not exist

这是对事务内部保存点的简要介绍。请记住,保存点是一种机制,用于在事务中为事务级数据的状态创建“可恢复位置”。

#PG培训#PG考试#postgresql培训#postgresql考试#postgresql认证



请使用浏览器的分享功能分享到微信等