并发写入示例
以下伪代码示例演示事务如何在并行运行时继续或等待。
到相同表的并发 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 查询将返回基于已完成的加载的计数。