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.
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:
deleteTxntidak diizinkan untuk melakukan, dan konflik terjadi -
WriteSerializable:
deleteTxndiizinkan untuk berkomitmen karena transaksi dapat dipesan. Status tabel yang dihasilkan seolah-olahinsertTxnterjadi setelahdeleteTxn, sehingga baris yang disisipkan adalah bagian dari tabel. Namun, riwayat Delta menunjukkan urutan penerapan fisik (insertTxnpada v1 sebelumnyadeleteTxndi 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:
- Logika diekspresikan menggunakan
INSERTlogika SQL atau mode tambahan - 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.