Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:
-
SQL Editor dan notebook: Gunakan sintaks
BEGIN ATOMIC ... END;atauBEGIN TRANSACTION; ... COMMIT;langsung di sel SQL atau gunakanspark.sql()di notebook Python/Scala. Lihat Mode transaksi. -
Aplikasi JDBC: Gunakan metode JDBC API (
setAutoCommit(false), ,commit()rollback()) dengan driver Databricks JDBC versi 3.0.5 ke atas. Lihat Contoh: Menggunakan transaksi. Untuk daftar operasi JDBC yang tidak didukung dalam transaksi, lihat Operasi JDBC yang tidak didukung. - Aplikasi ODBC: Gunakan Driver ODBC Databricks versi 2.10.0 ke atas. Untuk daftar operasi ODBC yang tidak didukung dalam transaksi, lihat Operasi ODBC yang tidak didukung.
-
Aplikasi Python: Gunakan Konektor SQL Databricks dengan
autocommit=False. Lihat Databricks SQL Connector untuk Python. Untuk daftar operasi konektor Python yang tidak didukung dalam transaksi, lihat Operasi konektor Python yang tidak didukung. - API Eksekusi Pernyataan: Jalankan transaksi menggunakan sintaks SQL melalui panggilan API. Lihat Gunakan dengan API Eksekusi Pernyataan.
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
- Mode transaksi
- Tutorial: Mengoordinasikan transaksi di seluruh tabel
- Penerapan katalog
- Tingkat isolasi dan konflik penulisan