SET TRANSACTION
设置当前事务的特性。
概要
SET TRANSACTION [transaction_mode] [READ ONLY | READ WRITE]
SET SESSION CHARACTERISTICS AS TRANSACTION transaction_mode
[READ ONLY | READ WRITE]
其中transaction_mode为下列之一:
ISOLATION LEVEL { SERIALIZABLE | READ COMMITTED | READ UNCOMMITTED}
描述
The SET TRANSACTION
命令设置当前 会话的特性。 它对任何子序列事务没有影响。
可用的事务特性是事务隔离级别和事务访问模式(读/写或只读)。
T一个事务的隔离级别决定当其他事务并行运行时该事务能看见什么数据。
- READ COMMITTED — 一个语句只能看到在它开始前提交的行。这是默认值。
- SERIALIZABLE — 当前事务的所有语句只能看到这个事务中执行的第一个查询或者 数据修改语句之前提交的行。
SQL 标准定义了两种额外的级别,READ UNCOMMITTED
和
REPEATABLE READ
。在Greenplum数据库中READ UNCOMMITTED
被当做为READ COMMITTED
。 REPEATABLE READ
还不支持; 如果需要REPEATABLE READ
行为,使用SERIALIZABLE
。
一个事务执行了第一个查询或者数据修改语句(SELECT
、INSERT
、
DELETE
、UPDATE
、FETCH
或
COPY
)之后就无法更改事务隔离级别。
事务的访问模式决定该事务是否为读/写或者只读。
读/写是默认值。 当一个事务为只读时,如果 SQL 命令INSERT
、UPDATE
、DELETE
和
COPY FROM
要写的表不是一个临时表,则它们不被允许。不允许 CREATE
、ALTER
和 DROP
命令。不允许GRANT
、REVOKE
、TRUNCATE
。如果EXPLAIN ANALYZE
和EXECUTE
要执行的命令是上述命令之一, 则它们也不被允许。这是一种高层的只读概念,它不能阻止所有对 磁盘的写入。
参数
SESSION CHARACTERISTICS
为一个会话的子事务序列设置默认的事务特征。
SERIALIZABLE
READ COMMITTED
READ UNCOMMITTED
SQL标准定义的四个事务隔离级别:READ
COMMITTED
、READ UNCOMMITTED
、 SERIALIZABLE
和REPEATABLE READ
。将一个语句只能看到在它开始前已经提交的行作为(samp class="ph codeph">READ COMMITTED)默认行为。在Greenplum数据库中,
READ UNCOMMITTED
被看作为 READ
COMMITTED
。 REPEATABLE READ
是不支持的,使用
SERIALIZABLE
作为替代。 SERIALIZABLE
是最严格的事务隔离级别。该级别模拟了串行化的事务执行,好像事务一个接着一个执行,串行而不是并行的。实际应用中使用该级别要准备由于线性执行的失败而尝试重启事务。
READ WRITE
READ ONLY
决定事务是读/写还是只读。读/写是默认模式。当一个事务是只读的,下面的SQL命令:
INSERT
、UPDATE
、DELETE
和
COPY FROM
执行将被禁止,如果他们将要写的表不是临时表。也不允许
CREATE
、ALTER
和DROP
命令执行。不允许执行
GRANT
、REVOKE
、TRUNCATE
。同时
EXPLAIN ANALYZE
和EXECUTE
要执行的命令是上诉命令之一也会不允许执行。
注解
如果执行SET TRANSACTION
之前没有START
TRANSACTION
或者BEGIN
,它会发出一个警告并且不会有任何效果。
可以通过在BEGIN
或者START TRANSACTION
中指定想要的transaction_modes来省掉SET TRANSACTION
。
会话默认的事务模式也可以通过设置配置参数 default_transaction_isolation和 default_transaction_read_only来设置。
示例
为当前事务设置一个事务隔离级别:
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
兼容性
SQL标准中定义了这些命令。 SERIALIZABLE
在标准中是默认的隔离级别。在Greenplum数据库中默认的隔离级别是
READ COMMITTED
。由于缺少断言锁,
SERIALIZABLE
并不是真正的串行化。从本质上讲,一个断言锁系统通过严格限制写的内容来防止幻读,而Greenplum数据库中使用的多版本并发控制模型通过严格显示读的内容来方式幻读。
在 SQL 标准中,可以用这些命令设置一个其他的事务特性:诊断区域 的尺寸。这个概念与嵌入式 SQL 有关,并且因此没有在 Greenplum数据库服务器中实现。
SQL 标准要求连续的transaction_modes 之间有逗号, 但是出于历史原因 Greenplum数据库允许省略逗号。
另见
[BEGIN](BEGIN.html#topic1)
, [LOCK](LOCK.html#topic1)
上级主题: SQL命令参考