pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
SET TRANSACTION — 设置当前事务的特性
SET TRANSACTIONtransaction_mode[, ...] SET SESSION CHARACTERISTICS AS TRANSACTIONtransaction_mode[, ...] wheretransaction_modeis 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 UNCOMMITTED和REPEATABLE READ。在PostgreSQL中,READ UNCOMMITTED被当作READ COMMITTED对待,而REPEATABLE READ被当作SERIALIZABLE对待。
在事务执行第一条查询或数据修改语句(SELECT, INSERT,DELETE, UPDATE, FETCH,或 COPY)之后,事务隔离级别就不能再更改。有关事务隔离和并发控制的更多信息,请参见 第 13 章。
事务访问模式决定事务是读/写还是只读。读/写是默认值。当事务为只读时, 下列 SQL 命令会被禁止:INSERT、UPDATE、 DELETE 以及 COPY FROM,前提是它们要写入的表不是临时表; 所有 CREATE、ALTER 和 DROP 命令;COMMENT、 GRANT、REVOKE、 TRUNCATE;以及 EXPLAIN ANALYZE 和 EXECUTE,前提是它们要执行的命令属于上述列表。 这是一个较高层面的只读概念,并不会阻止所有写入磁盘的行为。
如果执行SET TRANSACTION之前没有 START TRANSACTION或者 BEGIN,它会发出一条警告,除此之外没有任何效果。
也可以不使用 SET TRANSACTION,而是在 BEGIN 或 START TRANSACTION 中直接指定所需的 transaction_modes。
会话默认的事务模式也可以通过设置配置参数default_transaction_isolation和default_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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。