

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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="iceberg-writes-transaction-semantics"></a>

Redshift Iceberg 寫入查詢支援 ACID 和快照隔離。寫入交易具有保證的原子性，且在查詢意外失敗時不會產生部分更新。

多個 Iceberg 交易可以同時執行，如果兩個交易嘗試同時修改相同的資料表或分割區，則交易遞交會失敗。這可確保資料完整性。發生這種情況時，您必須手動解決衝突，並重新執行失敗的查詢。Amazon Redshift 不會自動重試並解決衝突。

單一 Iceberg 寫入查詢一律視為單一自動遞交交易。當明確交易區塊中包含 CREATE 或 INSERT 查詢等 Iceberg 寫入查詢時，無法在相同的交易區塊中執行其他查詢。交易將會失敗。

下列是一些範例。第一個範例示範單一陳述式查詢一律會在查詢完成後自動遞交。在此案例中，您要建立新的銷售訂單表格：

```
CREATE TABLE sales_schema.orders (
    order_id int, 
    customer_id int, 
    order_date date, 
    total_amount decimal(10,2)
) USING ICEBERG LOCATION 's3://my-data-lake/sales/orders/';
```

此範例是明確的交易區塊，用於使用 S3 資料表儲存貯體的三部分表示法插入客戶訂單。INSERT 查詢之後，交易不會自動遞交，而是使用 COMMIT 命令遞交和插入訂單資料：

```
BEGIN;
INSERT INTO "analytics_bucket@s3tablescatalog".sales_db.orders VALUES (12345, 9876, '2024-10-30', 299.99);
COMMIT;
```

此範例是明確的交易區塊復原案例，您可以在其中測試訂單插入，但決定將其取消。在 INSERT 查詢之後，交易不會自動遞交，而是在未插入測試順序的情況下，使用 ROLLBACK 命令轉返。

```
BEGIN;
INSERT INTO sales_schema.orders VALUES (12346, 5432, '2024-10-30', 150.75);
ROLLBACK;
```

此最終範例示範當您嘗試在與 INSERT 查詢相同的交易區塊中執行另一個陳述式時，交易會如何在不插入訂單資料的情況下失敗。在此案例中，您嘗試插入訂單並立即查詢資料表：

```
BEGIN;
INSERT INTO sales_schema.orders VALUES (12347, 7890, '2024-10-30', 425.50);
SELECT * FROM sales_schema.orders WHERE order_id = 12347;
```

唯一的例外是 `DROP TABLE`陳述式，其一律做為自動遞交陳述式，無法在明確的交易區塊內執行。這是為了在外部資料表`DROP TABLE`上維持與 相同的行為。如需詳細資訊，請參閱 [DROP TABLE](https://docs.aws.amazon.com/redshift/latest/dg/r_DROP_TABLE.html)。

**注意**  
Iceberg 寫入 SQLs無法從預存程序內執行。