Semantik transaksi - Amazon Redshift

Amazon Redshift tidak akan lagi mendukung pembuatan Python UDFs baru mulai 1 November 2025. Jika Anda ingin menggunakan Python UDFs, buat UDFs sebelum tanggal tersebut. Python yang ada UDFs akan terus berfungsi seperti biasa. Untuk informasi lebih lanjut, lihat posting blog.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Semantik transaksi

Kueri tulis Redshift Iceberg mendukung ACID dan isolasi snapshot. Transaksi tulis telah menjamin atomisitas dan tidak menghasilkan pembaruan sebagian ketika kueri gagal secara tak terduga.

Beberapa transaksi Iceberg dapat berjalan secara bersamaan, dan jika dua transaksi mencoba memodifikasi tabel atau partisi yang sama secara bersamaan, komit transaksi gagal. Ini memastikan integritas data. Ketika ini terjadi, Anda harus menyelesaikan konflik secara manual dan menjalankan kembali kueri yang gagal. Amazon Redshift tidak secara otomatis mencoba lagi dan menyelesaikan konflik.

Satu kueri tulis Iceberg selalu diperlakukan sebagai transaksi komit otomatis tunggal. Ketika kueri tulis Iceberg, seperti kueri CREATE atau INSERT, disertakan dalam blok transaksi eksplisit, tidak ada kueri lain yang dapat berjalan dalam blok transaksi yang sama. Transaksi akan gagal.

Berikut adalah beberapa contoh. Contoh pertama menunjukkan bahwa query pernyataan tunggal selalu auto-commit setelah query selesai. Dalam skenario ini, Anda membuat tabel pesanan penjualan baru:

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/';

Contoh ini adalah blok transaksi eksplisit untuk memasukkan pesanan pelanggan menggunakan notasi tiga bagian untuk bucket tabel S3. Transaksi tidak melakukan komit otomatis setelah kueri INSERT, melainkan melakukan dan menyisipkan data pesanan dengan perintah COMMIT:

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

Contoh ini adalah skenario rollback blok transaksi eksplisit di mana Anda menguji penyisipan pesanan tetapi memutuskan untuk membatalkannya. Transaksi tidak melakukan komit otomatis setelah kueri INSERT, melainkan memutar kembali dengan perintah ROLLBACK tanpa memasukkan urutan pengujian.

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

Contoh terakhir ini menunjukkan bagaimana, ketika Anda mencoba menjalankan pernyataan lain dalam blok transaksi yang sama dengan query INSERT, transaksi gagal tanpa memasukkan data pesanan. Dalam skenario ini, Anda mencoba menyisipkan pesanan dan segera menanyakan tabel:

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

Satu-satunya pengecualian untuk ini adalah DROP TABLE pernyataan, yang selalu berperilaku sebagai pernyataan komit otomatis dan tidak dapat berjalan dalam blok transaksi eksplisit. Ini untuk mempertahankan perilaku yang sama seperti DROP TABLE pada tabel eksternal. Untuk informasi selengkapnya, lihat DROP TABLE.

catatan

Iceberg write SQLs tidak dapat dieksekusi dari dalam prosedur tersimpan.