DML (Data Manipulation Language) tanpa penguncian di Data Management (DMS) memungkinkan Anda menjalankan pernyataan UPDATE, DELETE, dan INSERT...SELECT pada set data besar tanpa mengunci tabel atau menurunkan kinerja database. Mesin DMS secara otomatis membagi data target menjadi batch-batch kecil dan mengeksekusi pernyataan tersebut satu per satu, dengan jeda singkat di antara setiap batch untuk melindungi replikasi primary-to-secondary serta mengurangi beban pada database.
Latar Belakang
Seiring pertumbuhan data bisnis, Anda sering perlu membersihkan data historis atau memperbarui sebagian besar isi tabel. Dua pendekatan umum berikut sama-sama membawa risiko signifikan:
Menulis skrip untuk membagi data: Menggunakan klausa
LIMITuntuk membagi operasi DELETE atau UPDATE dalam halaman merupakan kesalahan umum. KarenaLIMITtanpa pemindaian indeks memaksa pemindaian seluruh tabel, tabel tetap dapat terkunci. Bahkan ketika pembagian diimplementasikan dengan benar, interval batch yang tidak disetel dengan tepat dapat menyebabkan keterlambatan replikasi parah antara database primary dan secondary.Ekstraksi manual oleh DBA: Membagi set data besar secara manual memakan waktu, rentan kesalahan, dan sulit disesuaikan setelah proses dimulai.
Selain risiko tersebut, dua mode kegagalan tambahan dapat terjadi saat melakukan operasi langsung pada tabel besar:
Pernyataan SQL tunggal yang memengaruhi terlalu banyak baris dapat menyebabkan jumlah entri log melebihi batas maksimum, sehingga pernyataan tersebut gagal sepenuhnya.
Pernyataan SQL yang dieksekusi tanpa menggunakan indeks tertentu dapat menyebabkan penguncian tabel, meningkatkan beban database, dan dalam kasus parah berpotensi menyebabkan kegagalan bisnis.
DML tanpa penguncian menghilangkan kedua risiko tersebut dengan mengotomatiskan pembagian batch dan pembatasan kecepatan di dalam DMS.
Cara Kerja
DML tanpa penguncian memproses satu pernyataan SQL melalui tiga tahap:
Pemisahan data — Mesin DMS menganalisis pernyataan tersebut dan membagi baris yang sesuai menjadi beberapa batch berdasarkan rentang indeks, sehingga menghindari pemindaian seluruh tabel.
Eksekusi batch — DMS menjalankan pernyataan tersebut pada satu batch dalam satu waktu, hanya memegang kunci tingkat baris berdurasi singkat selama setiap batch.
Interval buffer — Setelah setiap batch selesai, DMS menunggu sejenak sebelum memulai batch berikutnya. Interval ini memberi waktu bagi database secondary untuk mengejar ketinggalan dalam replikasi, sehingga menjaga keterlambatan replikasi primary-to-secondary tetap dalam batas yang dapat diterima.
Manfaat
Operasi perubahan data skala besar tidak mengganggu kelangsungan bisnis Anda.
Dampak terhadap kinerja dan penyimpanan database berkurang.
Efisiensi eksekusi tetap terjamin meskipun untuk perubahan data dalam jumlah besar.
Database yang Didukung
| Mesin database | Instans yang didukung |
|---|---|
| MySQL | ApsaraDB RDS for MySQL, PolarDB for MySQL, MyBase for MySQL, PolarDB for Xscale, database MySQL pihak ketiga |
| PostgreSQL | ApsaraDB RDS for PostgreSQL, PolarDB for PostgreSQL, MyBase for PostgreSQL, database PostgreSQL pihak ketiga |
| MariaDB | ApsaraDB for MariaDB, database MariaDB pihak ketiga |
| OceanBase | ApsaraDB for OceanBase dalam mode MySQL |
| Oracle-compatible | PolarDB for PostgreSQL (Compatible with Oracle) |
Batasan
Hanya pernyataan UPDATE, DELETE, dan INSERT...SELECT yang didukung.
UPDATE dan DELETE
| Batasan | Detail |
|---|---|
| Cakupan tabel | Hanya satu tabel |
| Klausa WHERE | Wajib. Untuk memperbarui atau menghapus semua baris, gunakan WHERE 1=1 |
| Subquery | Tidak didukung |
| Klausa LIMIT | Tidak didukung — penggunaan LIMIT untuk paginasi manual memaksa pemindaian seluruh tabel, yang justru menyebabkan penguncian tabel yang ingin dicegah oleh fitur ini |
INSERT...SELECT
| Batasan | Detail |
|---|---|
| SELECT scope | Hanya satu tabel |
| Klausa WHERE | Wajib dalam klausa SELECT. Untuk memilih semua baris, gunakan WHERE 1=1 |
| Klausa yang tidak diizinkan | LIMIT, ORDER BY, dan GROUP BY tidak didukung dalam klausa SELECT |
Kasus Penggunaan
Bersihkan data historis — Hapus baris yang tidak lagi diperlukan tanpa menghalangi operasi baca atau tulis pada tabel produksi.
Perbarui semua baris — Terapkan pembaruan kolom ke seluruh tabel tanpa menyebabkan keterlambatan replikasi atau gangguan layanan.