Tingkat isolasi (WriteSerializable dan Serializable)

Delta Lake di Azure Databricks mendukung dua tingkat isolasi yang mengontrol bagaimana operasi bersamaan pada tabel tertentu berinteraksi:

Tingkat isolasi Deskripsi
Dapat diserialisasikan Tingkat isolasi terkuat. Memastikan bahwa operasi tulis yang diterapkan dan semua bacaan dapat diserialisasikan. Operasi diperbolehkan selama ada urutan serial yang, ketika dijalankan satu per satu, menghasilkan hasil yang sama seperti yang terlihat dalam tabel. Untuk operasi tulis, urutan serial ini sama dengan urutan yang terlihat dalam riwayat tabel.
WriteSerializable (Default) Tingkat isolasi yang lebih lemah daripada Serializable. Memastikan bahwa hanya operasi tulis (bukan baca) yang dapat diserialisasikan. Ini tetap lebih kuat dibandingkan dengan isolasi Snapshot. Menyediakan keseimbangan konsistensi dan ketersediaan data yang baik untuk operasi yang paling umum.

Bagaimana tingkat isolasi memengaruhi bacaan

Operasi pembacaan selalu menggunakan isolasi snapshot. Tingkat isolasi tulis menentukan apakah pembaca dapat melihat cuplikan tabel yang, menurut riwayat, "tidak pernah ada."

  • Dapat diserialisasikan: Pembaca selalu hanya melihat tabel yang sesuai dengan riwayat
  • WriteSerializable: Pembaca dapat melihat status tabel yang tidak ada di log Delta

Contoh: Hapus dan sisipkan bersamaan

Pertimbangkan skenario di mana transaksi penghapusan jangka panjang dan transaksi penyisipan dimulai pada saat yang sama dan membaca versi v0. Transaksi sisipan melakukan komit terlebih dahulu dan membuat versi v1. Setelah itu, transaksi penghapusan mencoba mengonfirmasi v2:

t0: deleteTxn_START
t1: insertTxn_START
t2: insertTxn_COMMIT(v1)
t3: deleteTxn_COMMIT(v2)

Dalam skenario ini, deleteTxn tidak melihat data yang disisipkan oleh insertTxn dan tidak menghapusnya:

  • Dapat diserialisasikan: deleteTxn tidak diizinkan untuk melakukan, dan konflik terjadi
  • WriteSerializable: deleteTxn diizinkan untuk berkomitmen karena transaksi dapat dipesan. Status tabel yang dihasilkan seolah-olah insertTxn terjadi setelah deleteTxn, sehingga baris yang disisipkan adalah bagian dari tabel. Namun, riwayat Delta menunjukkan urutan penerapan fisik (insertTxn pada v1 sebelumnya deleteTxn di v2).

Atur tingkat isolasi

Atur tingkat isolasi menggunakan ALTER TABLE perintah :

ALTER TABLE <table-name> SET TBLPROPERTIES ('delta.isolationLevel' = <level-name>)

Di mana <level-name> adalah Serializable atau WriteSerializable.

Example:

-- Change from default WriteSerializable to Serializable
ALTER TABLE my_table SET TBLPROPERTIES ('delta.isolationLevel' = 'Serializable')

Kapan Delta Lake berkomitmen tanpa membaca tabel?

Delta Lake INSERT atau operasi tambahan tidak membaca status tabel sebelum melakukan jika kondisi berikut ini terpenuhi:

  1. Logika diekspresikan menggunakan INSERT logika SQL atau mode tambahan
  2. Logika tidak berisi subkueri atau kondisi yang mereferensikan tabel yang ditargetkan oleh operasi tulis

Seperti halnya penerapan lain, Delta Lake menggunakan metadata log transaksi untuk memvalidasi dan mengatasi versi tabel pada penerapan, tetapi tidak ada versi tabel yang benar-benar dibaca.

Nota

Banyak pola umum menggunakan MERGE operasi untuk menyisipkan data berdasarkan kondisi tabel. Meskipun mungkin untuk menulis ulang logika ini menggunakan INSERT pernyataan, jika ada ekspresi kondisional yang mereferensikan kolom dalam tabel target, pernyataan ini memiliki batasan konkurensi yang sama dengan MERGE.

Langkah berikutnya