# 设置交易

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

# 概要

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

# 描述

设置交易命令设置当前事务的特征。它对任何后续交易都没有影响。设置会话特征为会话的后续事务设置默认事务特征。这些默认值可以被覆盖设置交易对于个人交易。

可用的事务特性是事务隔离级别、事务访问模式(读/写或只读)和可延迟模式。此外,可以选择快照,但仅适用于当前事务,而不是会话默认值。

事务的隔离级别决定了当其他事务同时运行时该事务可以看到哪些数据:

阅读已提交

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

可重复阅读

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

可序列化

当前事务的所有语句只能看到在该事务中执行第一个查询或数据修改语句之前提交的行。如果并发可序列化事务之间的读取和写入模式会造成这些事务的任何串行(一次一个)执行都不会发生的情况,则其中一个将被回滚序列化失败错误。

SQL 标准定义了一个额外的级别,阅读未提交.在 PostgreSQL 中阅读未提交被视为阅读已提交.

在第一个查询或数据修改语句(选择,插入,删除,更新,拿来, 要么复制) 的交易已被执行。看第 13 章有关事务隔离和并发控制的更多信息。

事务访问模式决定事务是读/写还是只读。读/写是默认值。当事务为只读时,不允许使用以下 SQL 命令:插入,更新,删除, 和复制自如果他们要写入的表不是临时表;全部创建,改变, 和降低命令;评论,授予,撤销,截短;和解释分析执行如果他们将执行的命令在列出的命令中。这是只读的高级概念,它不会阻止所有写入磁盘。

可延期的交易属性没有效果,除非交易也是可序列化只读.当为事务选择了所有这三个属性时,事务可能会在第一次获取其快照时阻塞,之后它能够在没有正常开销的情况下运行可序列化交易,并且没有任何导致序列化失败或被序列化失败取消的风险。此模式非常适合长时间运行的报告或备份。

设置交易快照命令允许新事务以相同的方式运行快照作为现有交易。预先存在的事务必须已使用pg_export_snapshot功能(见第 9.27.5 节)。该函数返回一个快照标识符,必须将其提供给设置交易快照指定要导入的快照。在此命令中,标识符必须写为字符串文字,例如'000003A1-1'.设置交易快照只能在事务开始时执行,在第一个查询或数据修改语句之前(选择,插入,删除,更新,拿来, 要么复制) 的交易。此外,事务必须已经设置为可序列化或者可重复阅读隔离级别(否则,快照将被立即丢弃,因为阅读已提交模式为每个命令拍摄一个新快照)。如果进口交易使用可序列化隔离级别,那么导出快照的事务也必须使用该隔离级别。此外,非只读可序列化事务无法从只读事务导入快照。

# 笔记

如果设置交易没有事先执行开始交易或者开始,它会发出警告,否则无效。

可以免去设置交易而是指定所需的*交易模式*在开始或者开始交易.但该选项不适用于设置交易快照.

会话默认事务模式也可以通过配置参数设置或检查默认_交易_隔离,默认_交易_读_只要, 和默认_交易_可延期的.(实际上设置会话特征只是设置这些变量的详细等价物.) 这意味着可以在配置文件中设置默认值,通过更改数据库等咨询第 20 章了解更多信息。

当前事务的模式可以类似地通过配置参数设置或检查交易_隔离,交易_读_只要, 和交易_可延期的.设置这些参数之一的作用与对应的相同设置交易选项,对何时可以完成具有相同的限制。但是,这些参数不能在配置文件中设置,也不能从实时 SQL 以外的任何来源设置。

# 例子

要使用与现有事务相同的快照开始新事务,请首先从现有事务中导出快照。这将返回快照标识符,例如:

BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT pg_export_snapshot();
 pg_export_snapshot
## Compatibility

 These commands are defined in the SQL standard, except for the `DEFERRABLE` transaction mode and the `SET TRANSACTION SNAPSHOT` form, which are PostgreSQL extensions.

`SERIALIZABLE` is the default transaction isolation level in the standard. In PostgreSQL the default is ordinarily `READ COMMITTED`, but you can change it as mentioned above.

 In the SQL standard, there is one other transaction characteristic that can be set with these commands: the size of the diagnostics area. This concept is specific to embedded SQL, and therefore is not implemented in the PostgreSQL server.

 The SQL standard requires commas between successive *`transaction_modes`*, but for historical reasons PostgreSQL allows the commas to be omitted.