跳转至

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 UNCOMMITTEDSERIALIZABLE。 在SeaboxMPP数据库中,READ UNCOMMITTED被视为READ COMMITTED。如果指定SERIALIZABLE,则SeaboxMPP数据库将退回到REPEATABLE READ

在执行事务的第一个查询或数据修改语句(SELECTINSERTDELETEUPDATEFETCHCOPY)之后,不能更改事务隔离级别。

事务访问模式确定事务是读/写还是只读。 读/写是默认设置。当事务为只读时,不允许使用以下SQL命令:INSERTUPDATEDELETECOPY FROM(如果要写入的表不是临时表); 所有的CREATEALTERDROP命令;GRANTREVOKETRUNCATE; 如果EXPLAIN ANALYZEEXECUTE将要执行的命令在上述命令之中,也不被允许。这是只读的高级概念,不会阻止所有对磁盘的写入。

除非事务既是SERIALIZABLE又是READ ONLY,否则DEFERRABLE事务属性无效。当在事务上设置了所有这些属性后,该事务在首次获取其快照时可能会阻塞,此后它可以在没有SERIALIZABLE事务的正常开销的情况下运行,并且没有任何导致序列化失败或被序列化失败取消的风险。由于SeaboxMPP数据库不支持可序列化的事务,因此DEFERRABLE事务属性在SeaboxMPP数据库中无效。

参数

该SQL命令参数说明见下

SESSION CHARACTERISTICS
为会话的后续事务设置默认事务特性。
READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE

SQL标准定义了四个事务隔离级别: READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

READ UNCOMMITTED允许事务查看未提交的并发事务所做的更改。 在SeaboxMPP数据库中这是不可能的,因此READ UNCOMMITTEDREAD 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命令: INSERTUPDATEDELETECOPY FROM(如果要写入的表不是临时表); 所有的CREATEALTERDROP命令; GRANTREVOKETRUNCATE;如果EXPLAIN ANALYZEEXECUTE将要执行的命令在上述命令之中,也不被允许。
[NOT] DEFERRABLE

因为不支持SERIALIZABLE事务,所以DEFERRABLE事务属性在SeaboxMPP数据库中无效。

如果指定了DEFERRABLE且该事务既是SERIALIZABLE也是READ ONLY的,则该事务在首次获取其快照时可能会阻塞, 此后它可以在没有SERIALIZABLE事务的正常开销的情况下运行,并且不存在构成或被取消可串行化失败风险。 会造成任何贡献或被其取消序列化失败。 此模式非常适合长时间运行的报告或备份。

注解

如果在没有事先进行START TRANSACTIONBEGIN的情况下执行SET TRANSACTION,则会发出警告,并且该命令无效。

通过在BEGINSTART TRANSACTION中指定所需的事务模式, 可以省去SET TRANSACTION

也可以通过设置配置参数default_transaction_isolationdefault_transaction_read_onlydefault_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