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