Transactions

Penting

Transaksi yang menulis ke tabel Delta terkelola Katalog Unity ada di Pratinjau Umum.

Transaksi yang menulis ke tabel Iceberg yang dikelola oleh Unity Catalog ada di Pratinjau Privat. Untuk bergabung dengan pratinjau ini, kirim formulir pendaftaran pratinjau tabel Iceberg terkelola.

Transaksi memungkinkan Anda mengoordinasikan operasi di beberapa pernyataan dan tabel SQL. Semua perubahan berhasil bersama-sama atau digulung balik bersama-sama, memastikan konsistensi data di seluruh operasi dan tabel Anda. Transaksi memberikan jaminan ACID: atomisitas, konsistensi, isolasi, dan daya tahan. Lihat Apa jaminan ACID pada Azure Databricks?. Transaksi dapat digunakan dengan prosedur tersimpan dan SQL Scripting untuk membangun beban kerja pergudangan misi penting.

Contoh berikut menunjukkan transaksi:

BEGIN ATOMIC
  UPDATE accounts SET balance = balance - 100 WHERE id = 1;
  UPDATE accounts SET balance = balance + 100 WHERE id = 2;
  INSERT INTO audit_log VALUES (1, 2, 100, current_timestamp());
END;

Ketiga pernyataan berkomitmen bersama-sama. Jika ada pernyataan yang gagal, semua perubahan digulung balik dan Databricks mengakhiri transaksi tanpa efek samping.

Untuk praktik langsung dengan transaksi, lihat Tutorial: Mengoordinasikan transaksi di seluruh tabel.

Persyaratan

Untuk menjalankan transaksi yang mencakup beberapa pernyataan atau beberapa tabel:

  • Semua tabel harus ditulis pada:
    • Jadilah tabel terkelola Unity Catalog (Delta atau Iceberg)
    • Telah diaktifkan komit Katalog
  • Gunakan komputasi yang didukung:
    • Untuk transaksi non-interaktif, gunakan gudang SQL, komputasi tanpa server, atau kluster yang menjalankan Databricks Runtime 18.0 ke atas.
    • Untuk transaksi interaktif, gunakan gudang SQL apa pun.
    • Untuk transaksi pada aset yang dibagikan melalui Delta Sharing, gunakan Databricks Runtime versi 18.1 atau lebih tinggi.

Mode transaksi

Azure Databricks mendukung dua mode transaksi:

Modus Sintaksis Melakukan komitmen Rollback Paling cocok untuk
Non-interaktif Pernyataan gabungan ATOMIC Aktif otomatis saat berhasil Otomatis saat terjadi kesalahan Urutan tetap, pekerjaan terjadwal
Interactive MULAI TRANSAKSI; PENERAPAN; Manual Manual Logika kondisional, validasi dan penelusuran kesalahan, JDBC, ODBC, PyDBC

Untuk sintaks, contoh, dan pola penggunaan terperinci untuk kedua mode, lihat Mode transaksi.

Operasi yang Didukung

Anda dapat menggunakan operasi berikut dalam transaksi:

Pengoperasian Deskripsi
SELECT (pilihan lanjutan) Mengkueri data dan memvalidasi hasil
VALUES klausa Hasilkan data pengujian atau nilai konstanta
INSERT (termasuk semua varian) Menambahkan baris baru
UPDATE Mengubah baris yang sudah ada
COPY INTO Memuat data dari file ke dalam tabel Delta
DELETE FROM Menghapus baris
MERGE INTO Pola upsert menggabungkan sisipkan, perbarui, dan hapus

Membaca sumber dalam transaksi

Transaksi dapat dibaca dari tabel Unity Catalog (Delta dan Iceberg), tabel streaming, tampilan, dan tampilan materialisasi. Untuk membaca dari sumber non-transaksional, gunakan allow_nontransactional_reads petunjuk.

Membaca dari sumber non-transaksional

Untuk membaca dari sumber non-transaksional seperti file Parquet, file Avro, dan tabel federasi menggunakan JDBC, gunakan allow_nontransactional_reads petunjuk, seperti yang ditunjukkan contoh berikut:

BEGIN TRANSACTION;

-- Read from a non-transactional Parquet source
INSERT INTO transactional_table
SELECT col1, col2
FROM parquet.`/path/to/data`
WITH (allow_nontransactional_reads = true);

-- Read from a managed Delta table (no hint needed)
INSERT INTO another_table
SELECT * FROM managed_delta_table;

COMMIT;

Peringatan

Pembacaan non-transaksional tidak dapat diulang. Perubahan bersamaan pada data sumber selama transaksi dapat mengakibatkan pembacaan yang tidak konsisten.

Isolasi transaksi

Transaksi menyediakan bacaan berulang di semua pernyataan. Saat Anda mengakses tabel dalam transaksi, Azure Databricks mengambil rekam jepret tabel yang konsisten pada akses pertama. Semua bacaan berikutnya dari tabel tersebut menggunakan rekam jepret ini, sehingga bacaan Anda tetap konsisten meskipun pengguna lain secara bersamaan memodifikasi tabel yang sama.

Contoh:

BEGIN TRANSACTION;

-- First access to products table captures snapshot
SELECT * FROM products WHERE product_id = 1001;

-- Another user updates product 1001

-- Still reads the same snapshot (repeatable read)
SELECT * FROM products WHERE product_id = 1001;

COMMIT;

Deteksi konflik dan konkurensi

Azure Databricks menggunakan kontrol konkurensi optimis. Transaksi berlangsung tanpa penguncian, dan konflik terdeteksi pada waktu komit. Saat Anda berkomitmen, Azure Databricks memeriksa apakah transaksi lain memodifikasi data yang sama setelah transaksi Anda dimulai. Jika ada konflik, transaksi Anda gagal. Untuk transaksi non-interaktif, pembatalan juga terjadi secara otomatis. Untuk transaksi interaktif, Anda harus secara eksplisit menjalankan ROLLBACK untuk menghapus status transaksi sebelum memulai transaksi baru.

Transaksi non-interaktif mendukung konkurensi tingkat baris. Dua transaksi dapat mengubah baris yang berbeda dalam file data yang sama tanpa bertentangan saat konkurensi tingkat baris diaktifkan pada tabel target.

Transaksi interaktif mendukung konkurensi tingkat tabel.

Skenario konflik

Skenario Deskripsi
Konflik tulis-tulis Dua transaksi memperbarui atau menghapus baris yang sama.
Konflik baca-tulis Transaksi lain memodifikasi baris yang dibaca oleh transaksi Anda. Hanya berlaku untuk isolasi Serializable.
Konflik baca phantom Transaksi lain menambahkan baris baru yang sesuai dengan kriteria yang dibaca oleh transaksi Anda. Berlaku untuk isolasi WriteSerializable dan Serializable.
Konflik metadata Transaksi lain mengubah skema tabel atau properti.

Untuk detail selengkapnya tentang tingkat isolasi dan resolusi konflik untuk transaksi, lihat Mode transaksi. Untuk informasi tentang tingkat isolasi dan menulis perilaku konflik untuk tabel Delta Lake di Azure Databricks, lihat rekomendasi Optimisasi pada Azure Databricks.

Bagaimana transaksi muncul di log Delta

Setiap transaksi yang berhasil muncul sebagai entri tunggal dalam log Delta tabel, terlepas dari berapa banyak pernyataan individu yang berjalan dalam transaksi. Ini menyediakan jejak audit yang bersih dan menyederhanakan operasi putar kembali.

Operasi individual dalam transaksi tersedia sebagai metadata JSON dalam entri log Delta untuk transaksi.

Penanganan kesalahan dan pengguliran balik

Tabel berikut menjelaskan bagaimana pembatalan kesalahan terjadi untuk kedua jenis transaksi:

Skenario Perilaku untuk transaksi non-interaktif Perilaku untuk transaksi interaktif
Kegagalan pernyataan Pernyataan apa pun yang menimbulkan kesalahan menyebabkan pembatalan otomatis segera. Anda harus menjalankan ROLLBACK secara eksplisit untuk membuang perubahan jika sesi masih aktif.
Logika validasi atau aturan bisnis yang gagal Gunakan SIGNAL untuk melempar pengecualian dan memicu pemutaran kembali otomatis. Jalankan ROLLBACK untuk membuang perubahan.
Pemutusan sambungan sesi Transaksi secara otomatis dibatalkan. Transaksi secara otomatis dibatalkan.
Jeda Waktu Secara otomatis digulung balik setelah total durasi 48 jam. Secara otomatis kembali setelah 10 menit tidak aktif atau total durasi 48 jam (lihat Batasan). Transaksi dihentikan tanpa efek samping, tetapi Anda harus secara eksplisit menjalankan ROLLBACK untuk menghapus status transaksi jika sesi masih aktif.

Untuk transaksi interaktif, Anda dapat secara eksplisit mengembalikan menggunakan pernyataan ROLLBACK . Ini berguna ketika Anda ingin membuang perubahan berdasarkan logika validasi atau aturan bisnis, atau setelah kegagalan pernyataan ketika sesi tetap aktif.

Praktik terbaik

Ikuti praktik ini untuk mengurangi konflik dan mengoptimalkan performa transaksi.

Hindari konflik

  • Jaga agar transaksi tetap pendek: Transaksi jangka panjang meningkatkan kemungkinan konflik dan menahan sumber daya lebih lama.
  • Validasi lebih awal: Periksa prasyarat di awal transaksi agar gagal dengan cepat.
  • Databricks merekomendasikan transaksi non-interaktif untuk sebagian besar kasus penggunaan: Transaksi non-interaktif menggunakan konkurensi tingkat baris. Lihat Transaksi non-interaktif.
  • Coba lagi saat konflik: Ketika konflik terjadi, ulangi transaksi dengan data terbaru.

Menggunakan transaksi dari klien yang berbeda

Transaksi berfungsi di berbagai antarmuka klien:

Keterbatasan

Batasan berikut berlaku untuk transaksi:

Pembatasan Deskripsi
Konflik transaksi interaktif Transaksi interaktif (BEGIN TRANSACTION; ... COMMIT;) menggunakan deteksi konflik yang lebih konservatif daripada transaksi non-interaktif dan dapat berkonflik di tingkat tabel, kecuali untuk INSERT operasi yang tidak membaca dari tabel target. Gunakan transaksi tanpa interaksi (pernyataan gabungan ATOMIC) saat deteksi konflik tingkat baris penting. Lihat Transaksi non-interaktif.
Menetapkan sasaran Anda hanya dapat menulis ke tabel Delta atau Iceberg yang dikelola oleh Unity Catalog yang memiliki fitur tabel catalogManaged yang diaktifkan. Lihat Penerapan katalog.
Terbatas pada operasi DML saja Transaksi mendukung SELECT, , INSERTUPDATE, DELETE, COPY INTO, dan MERGE. Jalankan operasi DDL, seperti CREATE TABLE, , ALTER TABLEatau DROP TABLE, di luar transaksi.
Operasi metadata tidak didukung Operasi metadata tidak berfungsi di dalam transaksi terlepas dari protokol. Ini termasuk panggilan metadata berbasis Thrift RPC (seperti metode JDBC DatabaseMetaData dan fungsi katalog ODBC), perintah berbasis SQL (SHOW TABLES, SHOW DATABASES, DESCRIBE TABLE), dan kueri SELECT pada tabel information_schema atau tabel sistem. Jalankan operasi metadata di luar transaksi.
COPY INTO Keserempakan Transaksi COPY INTO gagal jika perintah lain COPY INTO berjalan bersamaan untuk menulis ke tabel yang sama dan melakukan commit terlebih dahulu.
Penulisan streaming tidak didukung Penulisan transaksional ke tabel streaming tidak didukung.
Tabel RLS dan CLM tidak didukung Tabel dengan filter Baris dan masker kolom tidak dapat berpartisipasi dalam transaksi.
Batas tabel dan tampilan Transaksi dapat membaca atau menulis hingga 100 tabel, dan dapat membaca hingga 100 tampilan. Setiap tabel dapat memiliki hingga 100 commit menengah dalam satu transaksi.
Perjalanan waktu tidak didukung Anda tidak dapat menggunakan perjalanan waktu dalam transaksi.
Batas waktu jeda Transaksi interaktif kembali setelah 10 menit tidak aktif. Transaksi dihentikan tanpa efek samping, tetapi Anda harus secara eksplisit menjalankan ROLLBACK untuk menghapus status transaksi jika sesi masih aktif.
Silsilah Transaksi menghasilkan riwayat setiap kali baca dan tulis terjadi. Peristiwa silsilah tetap ada meskipun transaksi digulung balik.
Durasi maksimum Semua transaksi secara otomatis dibatalkan setelah total durasi 48 jam. Untuk transaksi interaktif, transaksi dihentikan tanpa efek samping, tetapi Anda harus secara eksplisit menjalankan ROLLBACK untuk menghapus status transaksi jika sesi masih aktif.
Persyaratan pembagian tabel di Delta Sharing Penyedia Berbagi Delta harus berbagi tabel WITH HISTORY agar penerima dapat menjalankan transaksi di dalamnya. Penerima dapat menjalankan transaksi menggunakan semua jenis komputasi.
Pembatasan komputasi penerima Delta Sharing Azure Databricks penerima hanya dapat menjalankan transaksi pada tampilan berbagi, tampilan materialisasi, tabel streaming, dan tabel asing yang bukan format Iceberg. Penerima di akun Azure Databricks yang sama dengan penyedianya harus menggunakan komputasi bersama atau tanpa server. Penerima di akun lain harus menggunakan komputasi tanpa server.
Konflik tabel sumber Delta Sharing Penerima Sharing Delta tidak dapat merujuk pada tampilan yang dibagikan dan tabel yang dibagikan yang merujuk tabel sumber yang sama dalam satu transaksi.

Langkah berikutnya