On this page
SET TRANSACTION
SET TRANSACTION-设置当前 Transaction 的 Feature
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
命令设置当前事务的 Feature。它对任何后续 Transaction 都没有影响。 SET SESSION CHARACTERISTICS
为会话的后续事务设置默认事务 Feature。对于单个事务,这些默认值可以被SET TRANSACTION
覆盖。
可用的事务 Feature 是事务隔离级别,事务访问模式(读/写或只读)和可延期模式。此外,可以选择快照,尽管仅针对当前事务,而不是作为会话默认值。
事务的隔离级别确定当其他事务同时运行时,该事务可以看到哪些数据:
READ COMMITTED
- 一条语句只能看到在开始之前提交的行。这是默认值。
REPEATABLE READ
- 当前事务的所有语句只能看到在此事务中执行第一个查询或数据修改语句之前提交的行。
SERIALIZABLE
- 当前事务的所有语句只能看到在此事务中执行第一个查询或数据修改语句之前提交的行。如果并发可序列化事务之间的读取和写入模式会导致这种事务的任何串行(一次)执行都不可能发生的情况,则其中一个将回退,但出现
serialization_failure
错误。
- 当前事务的所有语句只能看到在此事务中执行第一个查询或数据修改语句之前提交的行。如果并发可序列化事务之间的读取和写入模式会导致这种事务的任何串行(一次)执行都不可能发生的情况,则其中一个将回退,但出现
SQL 标准定义了一个附加级别READ UNCOMMITTED
。在 PostgreSQL 中,READ UNCOMMITTED
被视为READ COMMITTED
。
在执行事务的第一个查询或数据修改语句(SELECT
,INSERT
,DELETE
,UPDATE
,FETCH
或COPY
)后,不能更改事务隔离级别。有关事务隔离和并发控制的更多信息,请参见Chapter 13。
事务访问模式确定事务是读/写还是只读。读/写是默认设置。当事务为只读时,不允许以下 SQL 命令:INSERT
,UPDATE
,DELETE
和COPY FROM
,如果它们要写入的表不是临时表;所有CREATE
,ALTER
和DROP
命令; COMMENT
,GRANT
,REVOKE
,TRUNCATE
; EXPLAIN ANALYZE
和EXECUTE
(如果它们将执行的命令在列出的命令中)。这是只读的高级概念,不会阻止所有对磁盘的写入。
除非事务也是SERIALIZABLE
和READ ONLY
,否则DEFERRABLE
事务属性无效。当为事务选择所有这三个属性时,该事务在首次获取其快照时可能会阻塞,此后它可以在没有SERIALIZABLE
事务的正常开销的情况下运行,并且没有任何有助于序列化或被序列化取消的风险失败。此模式非常适合长时间运行的报告或备份。
SET TRANSACTION SNAPSHOT
命令允许新事务以与现有事务相同的快照快照运行。预先存在的事务必须已使用pg_export_snapshot
函数导出其快照(请参见Section 9.26.5)。该函数返回快照标识符,必须将其赋予SET TRANSACTION SNAPSHOT
以指定要导入的快照。标识符必须在此命令中以字符串 Literals 形式编写,例如'000003A1-1'
。 SET TRANSACTION SNAPSHOT
只能在事务开始时,在事务的第一个查询或数据修改语句(SELECT
,INSERT
,DELETE
,UPDATE
,FETCH
或COPY
)之前执行。此外,事务必须已经设置为SERIALIZABLE
或REPEATABLE READ
隔离级别(否则,快照将被立即丢弃,因为READ COMMITTED
模式为每个命令获取一个新的快照)。如果导入事务使用SERIALIZABLE
隔离级别,则导出快照的事务也必须使用该隔离级别。同样,非只读可序列化事务无法从只读事务导入快照。
Notes
如果执行SET TRANSACTION
时没有先行START TRANSACTION
或BEGIN
,则它会发出警告,否则无效。
通过在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 19。
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 允许省略逗号。