Amazon Redshift
数据库开发人员指南 (API Version 2012-12-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

可序列化的隔离

某些应用程序不仅需要并发查询和加载,还需要能同时对多个表或同一个表进行写入。在此环境中,并发 指的是重叠,而不是安排在完全相同的时间运行。如果两个事务中的第二个事务在第一个提交前开始,则将两个事务视为并发。并发操作可源自由同一用户或不同用户控制的不同会话。

注意

Amazon Redshift 支持默认的自动提交 行为,其中,每个单独执行的 SQL 命令都将分别提交。如果您在某个事务数据块中包含一组命令(由 BEGINEND 语句定义),则该数据块将作为一个事务提交,以便您在必要时对其进行回滚。此行为的一个例外是 TRUNCATE 命令,此命令可自动提交当前事务中所做的所有待定更改,而不需要 END 语句。

在 Amazon Redshift 中,以保护性方式支持并发写入操作,即对表使用写入锁定和可序列化的隔离 原则。可序列化的隔离会保留一种错觉,即对某个表运行的事务是对该表运行的唯一事务。例如,两个同时运行的事务(T1 和 T2)必须生成与以下至少一个项相同的结果:

  • T1 和 T2 依次运行

  • T2 和 T1 依次运行

并发事务彼此不可见;它们不能相互检测对方的更改。每个并发事务将在事务开始时创建数据库快照。在大多数 SELECT 语句、DML 命令(例如 COPY、DELETE、INSERT、UPDATE 和 TRUNCATE)和以下 DDL 命令首次出现时,将在事务中创建数据库快照:

  • ALTER TABLE(添加或删除列)

  • CREATE TABLE

  • DROP TABLE

  • TRUNCATE TABLE

如果并发事务的任何 序列执行将产生与它们的并发执行相同的结果,则这些事务将被视为“可序列化的”且可安全运行。如果这些事务的任何序列执行均不产生相同结果,则执行会破坏可序列性的语句的事务将被中止并回滚。

系统目录表 (PG) 和其他 Amazon Redshift 系统表(STL 和 STV)在事务中未锁定;因此,DDL 和 TRUNCATE 操作引起的数据库对象更改在提交到任何并发事务时均可见。

例如,假设在两个并发事务(T1 和 T2)开始时,数据库中存在表 A。如果 T2 通过从 PG_TABLES 目录表中进行选择来返回一个表的列表,T1 将删除表 A 并提交,然后 T2 再次列出表,则将不再列出表 A。如果 T2 尝试查询已删除的表,则 Amazon Redshift 将返回“relation does not exist”错误。向 T2 返回表列表或检查表 A 是否存在的目录查询不受与针对用户表的操作相同的隔离规则的约束。

更新这些表的事务在读取已提交 隔离模式下运行。前缀为 PG 的目录表不支持快照隔离。

系统表和目录表的可序列化隔离

对于任何引用用户创建的表或 Amazon Redshift 系统表(STL 或 STV)的 SELECT 查询,还将在事务中创建数据库快照。不引用任何表的 SELECT 查询将不会创建新的事务数据库快照,只在系统目录表 (PG) 上操作的任何 INSERT、DELETE 或 UPDATE 语句也不会创建该快照。