Konkurensi tingkat baris

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.
  • REORG operasi memiliki semantik isolasi yang identik dengan OPTIMIZE saat menulis ulang file data. Saat Anda menggunakan REORG untuk 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.
  • REORG operasi memiliki semantik isolasi yang identik dengan OPTIMIZE saat menulis ulang file data. Saat Anda menggunakan REORG untuk 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, atau MERGE bersamaan tidak membaca data yang ditambahkan.
  • Memiliki paling banyak satu DELETEoperasi , UPDATE, atau MERGE yang 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.

Langkah berikutnya