SET TRANSACTION
更新时间:2026-06-24
设置当前事务的特性。
语法
SQL
1 SET TRANSACTION [transaction_mode] [READ ONLY | READ WRITE]
2
3 SET TRANSACTION SNAPSHOT snapshot_id
4
5 SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode
6 [READ ONLY | READ WRITE]
7 [NOT] DEFERRABLE
8 ```
9
10 其中`transaction_mode`为下列之一:
11
12 ``` sql
13 ISOLATION LEVEL {SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED}
14 ```
15
16
17
18## 描述
19
20`SET TRANSACTION`命令设置当前事务的特性。 它对任何后续交易都没有影响。
21
22 可用的事务特性是事务隔离级别,事务访问模式(读/写或只读)和可延迟的模式。
23
24
25 注意: 可延迟事务要求该事务为可序列化。PalopgMPP数据库不支持可序列化的事务,因此包含`DEFERRABLE`子句无效。
26
27
28 PalopgMPP数据库不支持`SET TRANSACTION SNAPSHOT`命令。
29
30 事务的隔离级别确定当其他事务同时运行时,该事务可以看到哪些数据。
31
32 - **READ COMMITTED** — 一条语句只能看到在开始之前提交的行。这是默认值。
33
34 - **REPEATABLE READ** — 当前事务中的所有语句只能看到在事务中执行的第一个查询语句之前提交的或该事务中数据修改语句修改的行。
35
36 SQL标准定义了两个附加级别,即`READ UNCOMMITTED`和`SERIALIZABLE`。 在PalopgMPP数据库中,`READ UNCOMMITTED`被视为`READ COMMITTED`。如果指定`SERIALIZABLE`,则PalopgMPP数据库将退回到`REPEATABLE READ`。
37
38 在执行事务的第一个查询或数据修改语句(`SELECT`,`INSERT`,`DELETE`,`UPDATE`,`FETCH`或`COPY`)之后,不能更改事务隔离级别。
39
40 事务访问模式确定事务是读/写还是只读。 读/写是默认设置。当事务为只读时,不允许使用以下SQL命令:`INSERT`,`UPDATE`,`DELETE`和`COPY FROM`(如果要写入的表不是临时表); 所有的`CREATE`,`ALTER`和`DROP`命令;`GRANT`,`REVOKE`,`TRUNCATE`; 如果`EXPLAIN ANALYZE`和`EXECUTE`将要执行的命令在上述命令之中,也不被允许。这是只读的高级概念,不会阻止所有对磁盘的写入。
41
42 除非事务既是`SERIALIZABLE`又是`READ ONLY`,否则`DEFERRABLE`事务属性无效。当在事务上设置了所有这些属性后,该事务在首次获取其快照时可能会阻塞,此后它可以在没有`SERIALIZABLE`事务的正常开销的情况下运行,并且没有任何导致序列化失败或被序列化失败取消的风险。由于PalopgMPP数据库不支持可序列化的事务,因此`DEFERRABLE`事务属性在PalopgMPP数据库中无效。
43
44
45
46## 参数
47
48该SQL命令参数说明见下
49
50 SESSION CHARACTERISTICS
51 : 为会话的后续事务设置默认事务特性。
52
53 READ UNCOMMITTED \| READ COMMITTED \| REPEATABLE READ \| SERIALIZABLE
54 : SQL标准定义了四个事务隔离级别: `READ UNCOMMITTED`,`READ COMMITTED`,`REPEATABLE READ`和`SERIALIZABLE`。
55
56 `READ UNCOMMITTED`允许事务查看未提交的并发事务所做的更改。 在PalopgMPP数据库中这是不可能的,因此`READ UNCOMMITTED`与`READ COMMITTED`相同。
57
58 `READ COMMITTED`是PalopgMPP数据库中的默认隔离级别,可确保语句只能看到在开始之前提交的行。如果在第一次执行该语句后又提交了另一个并发事务,则在一个事务中执行两次的相同语句可能会产生不同的结果。
59
60 `REPEATABLE READ`隔离级别确保事务只能看到在事务开始之前提交的行。 `REPEATABLE READ`是PalopgMPP数据库支持的最严格的事务隔离级别。 由于可串行化失败,使用`REPEATABLE READ`隔离级别的应用程序,必须准备重试事务。
61
62 `SERIALIZABLE`事务隔离级别确保当前事务的所有语句只能看到在此事务中执行第一个查询之前或此事务内数据修改语句提交的行。
63
64 如果并发可序列化事务之间的读取和写入模式会导致这种事务的任何串行(一次一个)执行都不可能发生的情况,则其中一个事务将回滚,并出现`serialization_failure`错误。
65
66 PalopgMPP数据库不完全支持标准定义的`SERIALIZABLE`,因此,如果指定`SERIALIZABLE`,则PalopgMPP数据库将退回到`REPEATABLE READ`。 有关PalopgMPP数据库中事务可串行化的更多信息,请参见兼容性。
67
68 READ WRITE \| READ ONLY
69 : 确定事务是读/写还是只读。 读/写是默认设置。 当事务为只读时,不允许使用以下SQL命令: `INSERT`,`UPDATE`,`DELETE`和`COPY FROM`(如果要写入的表不是临时表); 所有的`CREATE`,`ALTER`和`DROP`命令; `GRANT`,`REVOKE`,`TRUNCATE`;如果`EXPLAIN ANALYZE`和`EXECUTE`将要执行的命令在上述命令之中,也不被允许。
70
71 \[NOT\] DEFERRABLE
72 : 因为不支持`SERIALIZABLE`事务,所以`DEFERRABLE`事务属性在PalopgMPP数据库中无效。
73
74 如果指定了`DEFERRABLE`且该事务既是`SERIALIZABLE`也是`READ ONLY`的,则该事务在首次获取其快照时可能会阻塞, 此后它可以在没有`SERIALIZABLE`事务的正常开销的情况下运行,并且不存在构成或被取消可串行化失败风险。 会造成任何贡献或被其取消序列化失败。 此模式非常适合长时间运行的报告或备份。
75
76
77
78注解
79: 如果在没有事先进行`START TRANSACTION`或`BEGIN`的情况下执行`SET TRANSACTION`,则会发出警告,并且该命令无效。
80
81 通过在`BEGIN`或`START TRANSACTION`中指定所需的事务模式, 可以省去`SET TRANSACTION`。
82
83 也可以通过设置配置参数`default_transaction_isolation`,`default_transaction_read_only`和`default_transaction_deferrable`来设置会话默认事务模式。
84
85
86
87## 示例
88
89设置当前事务的事务隔离级别:
90
91 ``` sql
92 BEGIN;
93 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
94 ```
95
96
97
98兼容性说明
99: 这两个命令均在SQL标准中定义。 `SERIALIZABLE`是标准中的默认事务隔离级别。 在PalopgMPP数据库中,默认值为`READ COMMITTED`。 由于缺少谓词锁定,PalopgMPP数据库不完全支持`SERIALIZABLE`级别,因此当指定`SERIALIZABLE`时,它退回到`REPEATABLE READ`级别。
100
101 本质上,谓词锁定系统通过限制写的内容来防止幻像读取,而PalopgMPP数据库中使用的多版本并发控制模型(MVCC)通过限制读取的内容来防止幻像读取。
102
103
104 在SQL标准中,可以使用以下命令设置其他事务特性:诊断区域的大小。 此概念是嵌入式SQL特有的,因此未在PalopgMPP数据库服务器中实现。
105
106 `DEFERRABLE`事务模式是PalopgMPP数据库语言的扩展。
107
108 SQL标准要求连续的`transaction_modes`之间使用逗号, 但是由于历史原因,PalopgMPP数据库允许省略逗号。
109
110
111
112相关SQL命令
113: `BEGIN`, `LOCK`
评价此篇文章
