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.
Konkurensi tingkat baris mengurangi konflik antara operasi tulis bersamaan dengan mendeteksi perubahan di tingkat baris dan secara otomatis menyelesaikan konflik yang terjadi saat penulisan bersamaan memperbarui atau menghapus baris yang berbeda dalam file data yang sama.
Persyaratan untuk konkurensi tingkat baris
Tabel tidak mendukung konkurensi tingkat baris jika memiliki partisi yang ditentukan atau tidak mengaktifkan vektor penghapusan. Konkurensi tingkat baris memerlukan Databricks Runtime 14.2 ke atas.
Tabel dengan partisi tidak mendukung konkurensi tingkat baris tetapi masih dapat menghindari konflik antara OPTIMIZE dan semua operasi tulis lainnya saat vektor penghapusan diaktifkan. Lihat Batasan untuk konkurensi tingkat baris.
Untuk Versi Runtime Databricks sebelum 14.2, lihat Perilaku pratinjau konkurensi tingkat baris (warisan).
Nota
MERGE INTO dukungan konkurensi tingkat baris memerlukan Photon di Databricks Runtime 14.2. Dalam Databricks Runtime 14.3 LTS ke atas, Photon tidak diperlukan.
Matriks konflik dengan konkurensi tingkat baris
Tabel berikut menunjukkan pasangan operasi tulis mana yang dapat berkonflik di setiap tingkat isolasi dengan konkurensi tingkat baris diaktifkan:
| INSERT (1) | UPDATE, HAPUS, MERGE INTO | OPTIMIZE | |
|---|---|---|---|
| INSERT | Tidak bisa berkonflik | ||
| UPDATE, HAPUS, MERGE INTO | Tidak dapat berkonflik dalam WriteSerializable. Dapat berkonflik di Serializable saat memodifikasi baris yang sama. | Dapat berkonflik saat mengubah baris yang sama. | |
| OPTIMIZE | Tidak bisa berkonflik | Dapat berkonflik saat ZORDER BY digunakan. Tidak dapat berkonflik dengan cara lain. |
Dapat berkonflik saat ZORDER BY digunakan. Tidak dapat berkonflik dengan cara lain. |
(1) Semua INSERT operasi dalam tabel ini menjelaskan operasi penambah yang tidak membaca data apa pun dari tabel yang sama sebelum melakukan.
INSERT operasi yang berisi subkueri yang membaca tabel yang sama mendukung konkurensi yang sama dengan MERGE.
Nota
- Tabel dengan kolom identitas tidak mendukung transaksi bersamaan. Lihat Menggunakan kolom identitas di Delta Lake.
-
REORGoperasi memiliki semantik isolasi yang identik denganOPTIMIZEsaat menulis ulang file data. Saat Anda menggunakanREORGuntuk menerapkan peningkatan, protokol tabel berubah, yang bertentangan dengan semua operasi yang sedang berlangsung.
Menulis konflik tanpa konkurensi tingkat baris
Tabel tidak mendukung konkurensi tingkat baris jika memiliki partisi yang ditentukan atau tidak mengaktifkan vektor penghapusan. Databricks Runtime 14.2 atau lebih tinggi diperlukan untuk konkurensi tingkat baris.
Matriks konflik tanpa konkurensi tingkat baris
Tabel berikut menunjukkan pasangan operasi tulis mana yang dapat berkonflik di setiap tingkat isolasi:
| INSERT (1) | UPDATE, HAPUS, MERGE INTO | OPTIMIZE | |
|---|---|---|---|
| INSERT | Tidak bisa berkonflik | ||
| UPDATE, HAPUS, MERGE INTO | Tidak dapat berkonflik dalam WriteSerializable. Dapat berkonflik dalam Serializable. Lihat Menghindari konflik menggunakan partisi. | Dapat berkonflik dalam Serializable dan WriteSerializable. Lihat Menghindari konflik menggunakan partisi. | |
| OPTIMIZE | Tidak bisa berkonflik | Tidak dapat berkonflik dalam tabel dengan vektor penghapusan diaktifkan, kecuali ZORDER BY digunakan. Bisa berkonflik dalam kondisi lain. |
Tidak dapat berkonflik dalam tabel dengan vektor penghapusan diaktifkan, kecuali ZORDER BY digunakan. Bisa berkonflik dalam kondisi lain. |
(1) Semua INSERT operasi dalam tabel ini menjelaskan operasi penambah yang tidak membaca data apa pun dari tabel yang sama sebelum melakukan.
INSERT operasi yang berisi subkueri yang membaca tabel yang sama mendukung konkurensi yang sama dengan MERGE.
Nota
- Tabel dengan kolom identitas tidak mendukung transaksi bersamaan. Lihat Menggunakan kolom identitas di Delta Lake.
-
REORGoperasi memiliki semantik isolasi yang identik denganOPTIMIZEsaat menulis ulang file data. Saat Anda menggunakanREORGuntuk menerapkan peningkatan, protokol tabel berubah, yang bertentangan dengan semua operasi yang sedang berlangsung.
Batasan untuk konkurensi tingkat baris
Batasan berlaku untuk konkurensi tingkat baris. Untuk operasi berikut, resolusi konflik mengikuti keserentakan normal untuk konflik penulisan. Lihat Menulis konflik tanpa konkurensi tingkat baris.
| Pembatasan | Deskripsi |
|---|---|
| Klausa kondisional kompleks | Kondisi pada jenis data kompleks (struktur, array, peta), ekspresi non-deterministik, subkueri, dan subkueri berkorelasi |
MERGE persyaratan predikat |
Di Databricks Runtime 14.2, MERGE perintah harus menggunakan predikat eksplisit pada tabel target untuk memfilter baris yang cocok dengan tabel sumber |
| Kompromi performa | Deteksi konflik tingkat baris dapat meningkatkan total waktu eksekusi. Dengan banyak transaksi bersamaan, penulis memprioritaskan latensi atas resolusi konflik |
Semua batasan untuk vektor penghapusan juga berlaku. Lihat Batasan.
Hindari konflik menggunakan partisi
Untuk semua kasus yang ditandai "dapat berkonflik" dalam matriks konflik, konflik hanya terjadi jika kedua operasi memengaruhi kumpulan file yang sama. Untuk membuat dua set file terpisah, partisi tabel dengan kolom yang sama yang digunakan dalam kondisi operasi.
Example:
Perintah UPDATE table WHERE date > '2010-01-01' ... dan DELETE table WHERE date < '2010-01-01' konflik jika tabel tidak dipartisi berdasarkan tanggal, karena keduanya dapat mencoba mengubah file yang sama. Mempartisi tabel dengan date menghindari konflik.
Nota
Pemartisian tabel menurut kolom dengan kardinalitas tinggi dapat menyebabkan masalah performa karena banyaknya subdirektori.
Contoh: Menghindari konflik dengan filter partisi eksplisit
Pengecualian ini sering dilempar pada operasi bersamaan DELETE, UPDATE, atau MERGE yang bisa membaca partisi yang sama meskipun memperbarui partisi yang berbeda. Buat pemisahan eksplisit dalam kondisi operasi:
// Problem: Condition can scan the entire table
deltaTable.as("t").merge(
source.as("s"),
"s.user_id = t.user_id AND s.date = t.date AND s.country = t.country")
.whenMatched().updateAll()
.whenNotMatched().insertAll()
.execute()
// Solution: Add explicit partition filters
deltaTable.as("t").merge(
source.as("s"),
"s.user_id = t.user_id AND s.date = t.date AND s.country = t.country AND t.date = '" + date + "' AND t.country = '" + country + "'")
.whenMatched().updateAll()
.whenNotMatched().insertAll()
.execute()
Pengecualian konflik
Ketika konflik transaksi terjadi, Anda mengamati salah satu pengecualian berikut:
ConcurrentAppendException
Pengecualian ini terjadi ketika operasi bersamaan menambahkan file di partisi yang sama (atau di mana saja dalam tabel yang tidak dipartisi) yang dibaca oleh operasi Anda. Penambahan file dapat disebabkan oleh operasi INSERT, DELETE, UPDATE, atau MERGE.
Dengan tingkat isolasi WriteSerializable default, file yang ditambahkan oleh operasi buta INSERT (operasi yang menambahkan data tanpa membaca data apa pun) tidak bertentangan dengan operasi apa pun. Jika tingkat isolasi adalah Serializable, penambahan buta mungkin menyebabkan konflik.
Penting
Penambahan tanpa kontrol dapat menyebabkan konflik dalam mode WriteSerializable jika beberapa operasi bersamaan, seperti DELETE, UPDATE, atau MERGE, mungkin merujuk pada nilai yang dimasukkan oleh penambahan tanpa kontrol. Untuk menghindari hal ini:
- Pastikan operasi
DELETE,UPDATE, atauMERGEbersamaan tidak membaca data yang ditambahkan. - Memiliki paling banyak satu
DELETEoperasi ,UPDATE, atauMERGEyang dapat membaca data yang ditambahkan
ConcurrentDeleteReadException
Pengecualian ini terjadi ketika operasi bersamaan menghapus file yang dibaca operasi Anda. Penyebab umumnya adalah DELETE, UPDATE, atau MERGE operasi yang menulis ulang berkas.
ConcurrentDeleteDeleteException
Pengecualian ini terjadi ketika operasi bersamaan menghapus file yang juga dihapus operasi Anda. Ini bisa disebabkan oleh dua operasi pemadatan bersamaan yang menulis ulang file yang sama.
MetadataChangedException
Pengecualian ini terjadi ketika transaksi bersamaan memperbarui metadata tabel Delta. Penyebab umumnya adalah ALTER TABLE operasi atau penulisan yang memperbarui skema tabel.
ConcurrentTransactionException
Pengecualian ini terjadi jika kueri streaming menggunakan lokasi titik pemeriksaan yang sama dimulai beberapa kali secara bersamaan dan mencoba menulis ke tabel Delta secara bersamaan. Jangan pernah menjalankan dua kueri streaming dengan lokasi titik pemeriksaan yang sama secara bersamaan.
ProtocolChangedException (PengecualianPerubahanProtokol)
Pengecualian ini dapat terjadi ketika:
- Tabel Delta Anda ditingkatkan ke versi protokol baru (Anda mungkin perlu meningkatkan Runtime Databricks Anda)
- Beberapa penulis membuat atau mengganti tabel secara bersamaan
- Beberapa penulis menulis ke jalur file kosong secara bersamaan
Lihat Kompatibilitas dan protokol fitur Delta Lake.
Perilaku pratinjau konkurensi tingkat baris (warisan)
Bagian ini menjelaskan perilaku pratinjau untuk konkurensi tingkat baris di Databricks Runtime 14.1 ke bawah.
| Versi Runtime Databricks | Perilaku |
|---|---|
| Databricks Runtime 13.3 LTS ke atas | Tabel dengan pengklusteran cairan secara otomatis mengaktifkan konkurensi tingkat baris |
| Databricks Runtime 14.0 dan 14.1 | Aktifkan konkurensi tingkat baris untuk tabel dengan vektor penghapusan menggunakan konfigurasi di bawah ini |
| Databricks Runtime 14.1 ke bawah | Operasi DELETE hanya mendukung konkurensi tingkat baris pada komputasi non-Foton |
Untuk mengaktifkan konkurensi tingkat baris di Databricks Runtime 14.0 dan 14.1:
spark.databricks.delta.rowLevelConcurrencyPreview = true
Konkurensi tingkat baris selalu memerlukan vektor penghapusan.