

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# 并发写入示例
<a name="r_Serializable_isolation_example"></a>

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

## 使用可序列化隔离的并发写入示例
<a name="r_Serializable_isolation_example-serializable"></a>

### 使用可序列化隔离的到相同表的并发 COPY 操作
<a name="r_Serializable_isolation_example-concurrent-copy-operations-into-the-same-table"></a>

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

```
begin;
copy listing from ...;
end;
```

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

```
begin;
[waits]
copy listing from ;
end;
```

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

### 使用可序列化隔离的来自相同表的并发 DELETE 操作
<a name="r_Serializable_isolation_example-concurrent-delete-operations-from-the-same-table"></a>

事务 1 从表中删除行：

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

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

```
begin
[waits]
delete from listing where ;
end;
```

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

### 使用可序列化隔离的具有读取和写入操作组合的并发事务
<a name="r_Serializable_isolation_example-concurrent-transactions"></a>

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

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

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

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

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

## 使用快照隔离的并发写入示例
<a name="r_Serializable_isolation_example-snapshot"></a>

### 使用快照隔离的到相同表的并发 COPY 操作
<a name="r_Serializable_isolation_example-concurrent-copy-operations-into-the-same-table-snapshot"></a>

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

```
begin;
copy listing from ...;
end;
```

事务 2 在单独的会话中同时开始，并尝试将多个行复制到 LISTING 表中。事务 2 可以同时进行，直到任一事务都需要向目标表 `listing` 写入数据，此时它们将按顺序运行。

```
begin; 
//When the COPY statement from T1 needs to write data to the table, the COPY statement from T2 waits.
copy listing from ...; 
end;
```

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

### 使用快照隔离的来自相同表的并发 DELETE 操作
<a name="r_Serializable_isolation_example-concurrent-delete-operations-from-the-same-table-snapshot"></a>

使用快照隔离的来自相同表的并发 DELETE 或 UPDATE 操作的运行方式与使用可序列化隔离运行的操作相同。

### 使用快照隔离的具有读取和写入操作组合的并发事务
<a name="r_Serializable_isolation_example-concurrent-transactions-snapshot"></a>

使用快照隔离的组合操作运行的并发事务的运行方式与使用可序列化隔离运行的组合操作的事务相同。