SET TRANSACTION
SET TRANSACTION¶
设置当前事务的特性。
- 语法
-
``` sql SET TRANSACTION [transaction_mode] [READ ONLY | READ WRITE]
SET TRANSACTION SNAPSHOT snapshot_id
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode [READ ONLY | READ WRITE] [NOT] DEFERRABLE
其中`transaction_mode`为下列之一: ``` sql ISOLATION LEVEL {SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED}
- 描述
-
SET TRANSACTION
命令设置当前事务的特性。 它对任何后续交易都没有影响。可用的事务特性是事务隔离级别,事务访问模式(读/写或只读)和可延迟的模式。
注意: 可延迟事务要求该事务为可序列化。SeaboxMPP数据库不支持可序列化的事务,因此包含
DEFERRABLE
子句无效。SeaboxMPP数据库不支持
SET TRANSACTION SNAPSHOT
命令。事务的隔离级别确定当其他事务同时运行时,该事务可以看到哪些数据。
-
READ COMMITTED — 一条语句只能看到在开始之前提交的行。这是默认值。
-
REPEATABLE READ — 当前事务中的所有语句只能看到在事务中执行的第一个查询语句之前提交的或该事务中数据修改语句修改的行。
SQL标准定义了两个附加级别,即
READ UNCOMMITTED
和SERIALIZABLE
。 在SeaboxMPP数据库中,READ UNCOMMITTED
被视为READ COMMITTED
。如果指定SERIALIZABLE
,则SeaboxMPP数据库将退回到REPEATABLE READ
。在执行事务的第一个查询或数据修改语句(
SELECT
,INSERT
,DELETE
,UPDATE
,FETCH
或COPY
)之后,不能更改事务隔离级别。事务访问模式确定事务是读/写还是只读。 读/写是默认设置。当事务为只读时,不允许使用以下SQL命令:
INSERT
,UPDATE
,DELETE
和COPY FROM
(如果要写入的表不是临时表); 所有的CREATE
,ALTER
和DROP
命令;GRANT
,REVOKE
,TRUNCATE
; 如果EXPLAIN ANALYZE
和EXECUTE
将要执行的命令在上述命令之中,也不被允许。这是只读的高级概念,不会阻止所有对磁盘的写入。除非事务既是
SERIALIZABLE
又是READ ONLY
,否则DEFERRABLE
事务属性无效。当在事务上设置了所有这些属性后,该事务在首次获取其快照时可能会阻塞,此后它可以在没有SERIALIZABLE
事务的正常开销的情况下运行,并且没有任何导致序列化失败或被序列化失败取消的风险。由于SeaboxMPP数据库不支持可序列化的事务,因此DEFERRABLE
事务属性在SeaboxMPP数据库中无效。 -
- 参数
-
该SQL命令参数说明见下
- SESSION CHARACTERISTICS
- 为会话的后续事务设置默认事务特性。
- READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE
-
SQL标准定义了四个事务隔离级别:
READ UNCOMMITTED
,READ COMMITTED
,REPEATABLE READ
和SERIALIZABLE
。READ UNCOMMITTED
允许事务查看未提交的并发事务所做的更改。 在SeaboxMPP数据库中这是不可能的,因此READ UNCOMMITTED
与READ COMMITTED
相同。READ COMMITTED
是SeaboxMPP数据库中的默认隔离级别,可确保语句只能看到在开始之前提交的行。如果在第一次执行该语句后又提交了另一个并发事务,则在一个事务中执行两次的相同语句可能会产生不同的结果。REPEATABLE READ
隔离级别确保事务只能看到在事务开始之前提交的行。REPEATABLE READ
是SeaboxMPP数据库支持的最严格的事务隔离级别。 由于可串行化失败,使用REPEATABLE READ
隔离级别的应用程序,必须准备重试事务。SERIALIZABLE
事务隔离级别确保当前事务的所有语句只能看到在此事务中执行第一个查询之前或此事务内数据修改语句提交的行。如果并发可序列化事务之间的读取和写入模式会导致这种事务的任何串行(一次一个)执行都不可能发生的情况,则其中一个事务将回滚,并出现
serialization_failure
错误。SeaboxMPP数据库不完全支持标准定义的
SERIALIZABLE
,因此,如果指定SERIALIZABLE
,则SeaboxMPP数据库将退回到REPEATABLE READ
。 有关SeaboxMPP数据库中事务可串行化的更多信息,请参见兼容性。 - READ WRITE | READ ONLY
- 确定事务是读/写还是只读。 读/写是默认设置。 当事务为只读时,不允许使用以下SQL命令:
INSERT
,UPDATE
,DELETE
和COPY FROM
(如果要写入的表不是临时表); 所有的CREATE
,ALTER
和DROP
命令;GRANT
,REVOKE
,TRUNCATE
;如果EXPLAIN ANALYZE
和EXECUTE
将要执行的命令在上述命令之中,也不被允许。 - [NOT] DEFERRABLE
-
因为不支持
SERIALIZABLE
事务,所以DEFERRABLE
事务属性在SeaboxMPP数据库中无效。如果指定了
DEFERRABLE
且该事务既是SERIALIZABLE
也是READ ONLY
的,则该事务在首次获取其快照时可能会阻塞, 此后它可以在没有SERIALIZABLE
事务的正常开销的情况下运行,并且不存在构成或被取消可串行化失败风险。 会造成任何贡献或被其取消序列化失败。 此模式非常适合长时间运行的报告或备份。
- 注解
-
如果在没有事先进行
START TRANSACTION
或BEGIN
的情况下执行SET TRANSACTION
,则会发出警告,并且该命令无效。通过在
BEGIN
或START TRANSACTION
中指定所需的事务模式, 可以省去SET TRANSACTION
。也可以通过设置配置参数
default_transaction_isolation
,default_transaction_read_only
和default_transaction_deferrable
来设置会话默认事务模式。 - 示例
-
设置当前事务的事务隔离级别:
BEGIN; SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
- 兼容性说明
-
这两个命令均在SQL标准中定义。
SERIALIZABLE
是标准中的默认事务隔离级别。 在SeaboxMPP数据库中,默认值为READ COMMITTED
。 由于缺少谓词锁定,SeaboxMPP数据库不完全支持SERIALIZABLE
级别,因此当指定SERIALIZABLE
时,它退回到REPEATABLE READ
级别。本质上,谓词锁定系统通过限制写的内容来防止幻像读取,而SeaboxMPP数据库中使用的多版本并发控制模型(MVCC)通过限制读取的内容来防止幻像读取。
在SQL标准中,可以使用以下命令设置其他事务特性:诊断区域的大小。 此概念是嵌入式SQL特有的,因此未在SeaboxMPP数据库服务器中实现。
DEFERRABLE
事务模式是SeaboxMPP数据库语言的扩展。SQL标准要求连续的
transaction_modes
之间使用逗号, 但是由于历史原因,SeaboxMPP数据库允许省略逗号。 - 相关SQL命令
BEGIN
,LOCK