并发写入示例 - Amazon Redshift

并发写入示例

以下伪代码示例演示事务如何在并行运行时继续或等待。

到相同表的并发 COPY 操作

事务 1 将行复制到 LISTING 表中:

begin; copy listing from ...; end;

事务 2 在单独的会话中同时开始,并尝试将多个行复制到 LISTING 表中。事务 2 必须等待事务 1 解除对 LISTING 表的写入锁定,然后才能继续。

begin; [waits] copy listing from ; end;

如果一个或两个事务包含 INSERT 命令而非 COPY 命令,也会产生相同行为。

来自相同表的并发 DELETE 操作

事务 1 从表中删除行:

begin; delete from listing where ...; end;

事务 2 同时开始并尝试从相同表中删除行。它将成功,因为它会等待事务 1 完成后再尝试删除行。

begin [waits] delete from listing where ; end;

如果一个或两个事务包含对相同表的 UPDATE 命令而非 DELETE 命令,也会产生相同行为。

具有读取和写入操作组合的并发事务

在此示例中,在提交之前,事务 1 从 USERS 表中删除行、重新加载表、运行 COUNT(*) 查询,然后 ANALYZE:

begin; delete one row from USERS table; copy ; select count(*) from users; analyze ; end;

同时,事务 2 将开始。此事务尝试将额外的行复制到 USERS 表中、分析该表,然后运行与第一个事务相同的 COUNT(*) 查询:

begin; [waits] copy users from ...; select count(*) from users; analyze; end;

第二个事务将成功,因为它必须等待第一个事务完成。其 COUNT 查询将返回基于已完成的加载的计数。