选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

SET TRANSACTION

SET TRANSACTION — 设置当前事务的特性

大纲

SET TRANSACTION transaction_mode [, ...]
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

描述

SET TRANSACTION命令设置当前事务的特性。 它对任何后续事务都没有影响。SET SESSION CHARACTERISTICS设置一个会话中后续事务的默认 事务特性。对于单个事务,这些默认值可以用 SET TRANSACTION覆盖。

可用的事务特性是事务隔离级别和事务访问模式(读/写或只读)。

事务的隔离级别决定当其他事务并发运行时该事务能看到什么数据:

READ COMMITTED

一条语句只能看到在它开始之前已提交的行。这是默认值。

SERIALIZABLE

当前事务中的所有语句都只能看到在该事务中执行第一条查询或 数据修改语句之前已提交的行。

SQL 标准还定义了另外两个级别:READ UNCOMMITTEDREPEATABLE READ。在PostgreSQL中,READ UNCOMMITTED被当作READ COMMITTED对待,而REPEATABLE READ被当作SERIALIZABLE对待。

在事务执行第一条查询或数据修改语句(SELECTINSERTDELETEUPDATEFETCH,或 COPY)之后,事务隔离级别就不能再更改。有关事务隔离和并发控制的更多信息,请参见 第 13 章

事务访问模式决定事务是读/写还是只读。读/写是默认值。当事务为只读时, 下列 SQL 命令会被禁止:INSERTUPDATEDELETE 以及 COPY FROM,前提是它们要写入的表不是临时表; 所有 CREATEALTERDROP 命令;COMMENTGRANTREVOKETRUNCATE;以及 EXPLAIN ANALYZEEXECUTE,前提是它们要执行的命令属于上述列表。 这是一个较高层面的只读概念,并不会阻止所有写入磁盘的行为。

注解

如果执行SET TRANSACTION之前没有 START TRANSACTION或者 BEGIN,它会发出一条警告,除此之外没有任何效果。

也可以不使用 SET TRANSACTION,而是在 BEGINSTART TRANSACTION 中直接指定所需的 transaction_modes

会话默认的事务模式也可以通过设置配置参数default_transaction_isolationdefault_transaction_read_only来设置。(事实上,SET SESSION CHARACTERISTICS只是用SET设置这些变量的一种冗长的等价形式。)这意味着这些默认值可以在配置文件中设置,也可以通过ALTER DATABASE等方式设置。更多信息请参考第 18 章

兼容性

两个命令都在SQL标准中定义。标准中默认的事务隔离级别是SERIALIZABLE。在PostgreSQL中默认通常是READ COMMITTED,但你可以像上面提到的那样更改它。由于缺少谓词锁,SERIALIZABLE级别并不是真正可串行化的。详见第 13 章

在 SQL 标准中,还可以用这些命令设置另一项事务特性:诊断区域 的大小。这个概念特定于嵌入式 SQL,因此没有在 PostgreSQL服务器中实现。

SQL 标准要求在连续的transaction_modes之间有逗号, 但出于历史原因, PostgreSQL允许省略逗号。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。