pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
SET TRANSACTION — set the characteristics of the current 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 [ NOT ] DEFERRABLE
SET TRANSACTION命令设置当前事务的特性。 它对任何后续事务都没有影响。SET SESSION CHARACTERISTICS设置一个会话中后续事务的默认 事务特性。对于单个事务,这些默认值可以用 SET TRANSACTION覆盖。
可用的事务特性包括事务隔离级别、事务访问模式(读/写或只读)以及可延迟模式。
一个事务的隔离级别决定当其他事务并发运行时该事务能看见什么数据:
READ COMMITTED一条语句只能看到在它开始之前已提交的行。这是默认值。
REPEATABLE READ当前事务中的所有语句都只能看到在该事务中执行第一条查询或 数据修改语句之前已提交的行。
SERIALIZABLE当前事务中的所有语句只能看到在该事务中执行第一条查询或数据修改语句之前已提交的行。 如果一组并发可串行化事务之间的读写模式会造成任何串行(一次一个)执行都不可能出现的情况,其中一个事务将带着 serialization_failure SQLSTATE 被回滚。
The SQL standard defines one additional level, READ UNCOMMITTED. In PostgreSQL READ UNCOMMITTED is treated as READ COMMITTED.
在事务执行第一条查询或数据修改语句(SELECT, INSERT,DELETE, UPDATE, FETCH,或 COPY)之后,事务隔离级别就不能再更改。有关事务隔离和并发控制的更多信息,请参见 第 13 章。
事务访问模式决定事务是读/写还是只读。读/写是默认值。当事务为只读时, 下列 SQL 命令会被禁止:INSERT、UPDATE、 DELETE 以及 COPY FROM,前提是它们要写入的表不是临时表; 所有 CREATE、ALTER 和 DROP 命令;COMMENT、 GRANT、REVOKE、 TRUNCATE;以及 EXPLAIN ANALYZE 和 EXECUTE,前提是它们要执行的命令属于上述列表。 这是一个较高层面的只读概念,并不会阻止所有写入磁盘的行为。
除非事务同时是 SERIALIZABLE 且 READ ONLY 的,否则 DEFERRABLE 事务属性没有任何效果。 When all of these properties are set on a transaction, the transaction may block when first acquiring its snapshot, 之后它就可以在不承担 SERIALIZABLE 事务正常开销、也不会导致或因序列化失败被取消的任何风险的情况下运行。这种模式非常适合长时间运行的报告或备份。
如果在没有先执行 START TRANSACTION 或 BEGIN 的情况下执行 SET TRANSACTION,它将看起来没有任何效果,因为事务会立即结束。
也可以不使用 SET TRANSACTION,而是在 BEGIN 或 START TRANSACTION 中直接指定所需的 transaction_modes。
会话默认的事务模式也可以通过配置参数 default_transaction_isolation、 default_transaction_read_only和 default_transaction_deferrable来设置(实际上, SET SESSION CHARACTERISTICS只是用 SET设置这些变量的一种更冗长的等价写法)。这意味着可以通过配置文件、 ALTER DATABASE等方式设置默认值。详见 第 18 章。
这两个命令都在 SQL 标准中有定义。标准中的默认事务隔离级别是 SERIALIZABLE。在 PostgreSQL 中默认通常是 READ COMMITTED,但可以按上文所述更改。
在 SQL 标准中,还可以用这些命令设置另一项事务特性:诊断区域 的大小。这个概念特定于嵌入式 SQL,因此没有在 PostgreSQL服务器中实现。
DEFERRABLE transaction_mode 是 PostgreSQL 的语言扩展。
SQL 标准要求在连续的transaction_modes之间有逗号, 但出于历史原因, PostgreSQL允许省略逗号。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。