Postgresql 中文操作指南
Synopsis
SET TRANSACTION transaction_mode [, ...]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [, ...]
where transaction_mode is one of:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
READ WRITE | READ ONLY
[ NOT ] DEFERRABLE
Description
SET TRANSACTION 命令设置了当前事务的特性。它对任何后续事务均无影响。 SET SESSION CHARACTERISTICS 设置会话后续事务的默认事务特性。这些默认值可通过 SET TRANSACTION 针对单个事务进行重写。
可用的事务特性是事务隔离级别、事务访问模式(读/写或只读)和可延迟模式。此外,可以选中快照,但仅适用于当前事务,不能作为会话默认值。
事务的隔离级别决定了当其他事务同时运行时,该事务可以看到哪些数据:
-
READ COMMITTED
-
一个语句只能看到在它开始之前提交的行。这是默认设置。
-
-
REPEATABLE READ
-
当前事务的所有语句只能看到在此事务中执行第一个查询或数据修改语句之前提交的行。
-
-
SERIALIZABLE
-
当前事务的所有语句只能看到在此事务中执行第一个查询或数据修改语句之前提交的行。如果在并发可序列化事务中的读取和写入模式会造成无法对那些事务的任何串行(一次执行一个)执行发生的情形,其中一个事务将使用 serialization_failure 错误进行回滚。
-
SQL 标准定义了附加级别 READ UNCOMMITTED 。在 PostgreSQL 中, READ UNCOMMITTED 被视为 READ COMMITTED 。
在事务的第一个查询或数据修改语句( SELECT 、 INSERT 、 DELETE 、 UPDATE 、 MERGE 、 FETCH 或 COPY )已执行后,事务的隔离级别不能更改。请参阅 Chapter 13 以了解更多有关事务隔离和并发控制的信息。
事务访问模式确定事务是读/写还是只读。读/写是默认模式。当事务处于只读模式时,禁止以下 SQL 命令: INSERT 、 UPDATE 、 DELETE 、 MERGE 和 COPY FROM (如果它们要写入的表不是临时表);所有 CREATE 、 ALTER 和 DROP 命令; COMMENT 、 GRANT 、 REVOKE 、 TRUNCATE ;以及 EXPLAIN ANALYZE 和 EXECUTE ,如果它们要执行的命令在所列命令中。这是一个高级只读概念,它不会阻止所有写入到磁盘。
除非事务同时是 SERIALIZABLE 和 READ ONLY ,否则 DEFERRABLE 事务属性没有任何效果。当事务选中所有这三个属性时,事务可能会在第一次获取其快照时阻塞,之后它能够在没有 SERIALIZABLE 事务的正常开销的情况下运行,并且没有任何风险导致序列化失败或被其取消。此模式非常适合长时间运行的报告或备份。
SET TRANSACTION SNAPSHOT 命令允许新事务与现有事务运行相同的 snapshot 。预先存在的交易必须使用 pg_export_snapshot 函数导出了其快照(参见 Section 9.27.5 )。该函数返回一个快照标识符,必须将其提供给 SET TRANSACTION SNAPSHOT 以指定要导入哪个快照。标识符必须在此命令中写为字符串文字,例如 '00000003-0000001B-1' 。 SET TRANSACTION SNAPSHOT 只能在事务的开始执行,在事务的第一个查询或数据修改语句 ( SELECT 、 INSERT 、 DELETE 、 UPDATE 、 MERGE 、 FETCH 或 COPY ) 之前执行。此外,事务必须已经设置为 SERIALIZABLE 或 REPEATABLE READ 隔离级别(否则,快照将立即被丢弃,因为 READ COMMITTED 模式为每个命令采用一个新快照)。如果导入事务使用 SERIALIZABLE 隔离级别,则导出快照的事务也必须使用该隔离级别。此外,非只读可序列化事务无法从只读事务导入快照。
Notes
如果在没有先前的 START TRANSACTION 或 BEGIN 的情况下执行 SET TRANSACTION ,它会发出一个警告,否则没有效果。
可以通过在 BEGIN 或 START TRANSACTION 中指定所需的 transaction_modes 来取消 SET TRANSACTION 。但该选项不适用于 SET TRANSACTION SNAPSHOT 。
还可以通过配置参数 default_transaction_isolation 、 default_transaction_read_only 和 default_transaction_deferrable 来设置或检查会话默认事务模式。(实际上, SET SESSION CHARACTERISTICS 只是使用 SET 设置这些变量的一个冗长的等价项。)这意味着可以在配置文件中通过 ALTER DATABASE 等等来设置默认值。请参阅 Chapter 20 了解更多信息。
当前事务的模式也可以通过配置参数 transaction_isolation 、 transaction_read_only 和 transaction_deferrable 来设置或检查。设置其中一个参数的作用与相应的 SET TRANSACTION 选项相同,并且可以应用相同的限制。但是,这些参数不能在配置文件中设置,也不能从实时 SQL 以外的任何来源设置。
Examples
要开始一个与已有事务使用相同快照的新事务,首先从现有事务导出快照。这将返回快照标识符,例如:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
pg_export_snapshot
---------------------
00000003-0000001B-1
(1 row)
然后在新建事务的开头在 SET TRANSACTION SNAPSHOT 命令中给出快照标识符:
BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION SNAPSHOT '00000003-0000001B-1';
Compatibility
这些命令是在 SQL 标准中定义的,但 DEFERRABLE 事务模式和 SET TRANSACTION SNAPSHOT 表单除外,它们是 PostgreSQL 扩展。
SERIALIZABLE 是标准中的默认事务隔离级别。在 PostgreSQL 中,默认值通常是 READ COMMITTED ,但如上所述,您可以更改它。
在 SQL 标准中,还有另一个可以用这些命令设置的事务特性:诊断区域的大小。这个概念特定于嵌入式 SQL,因此在 PostgreSQL 服务器中没有实现。
SQL 标准要求在连续的 transaction_modes 之间使用逗号,但出于历史原因,PostgreSQL 允许省略逗号。