sql-set-transaction.zh.md 5.9 KB
Newer Older
李少辉-开发者's avatar
李少辉-开发者 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
## 设置交易

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 章](mvcc.html)有关事务隔离和并发控制的更多信息。

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

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

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

## 笔记

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

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

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

当前事务的模式可以类似地通过配置参数设置或检查[交易\_隔离](runtime-config-client.html#GUC-TRANSACTION-ISOLATION),[交易\_读\_只要](runtime-config-client.html#GUC-TRANSACTION-READ-ONLY), 和[交易\_可延期的](runtime-config-client.html#GUC-TRANSACTION-DEFERRABLE).设置这些参数之一的作用与对应的相同`设置交易`选项,对何时可以完成具有相同的限制。但是,这些参数不能在配置文件中设置,也不能从实时 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.
```