Hologres mendukung transaksi Data Definition Language (DDL) penuh dan transaksi Data Manipulation Language (DML) parsial. Secara default, Hologres mendukung transaksi untuk pernyataan SQL tunggal. Topik ini menjelaskan kemampuan transaksi Hologres.
Skenario Dukungan Transaksi
Hologres mendukung transaksi dalam skenario berikut:
-
Transaksi untuk multiple pernyataan DDL
Anda dapat membuat dan melakukan rollback terhadap beberapa tabel dalam satu transaksi untuk memastikan atomicity. Berikut adalah contohnya:
BEGIN; DROP TABLE IF EXISTS ddl_test; CREATE TABLE ddl_test( uid TEXT NOT NULL, name TEXT NOT NULL); COMMIT; -
Mixed DML transactions (Beta)
Versi Hologres V2.0 dan yang lebih baru mendukung pernyataan DML campuran dalam satu transaksi yang sama. Fitur ini menjamin atomicity dan konsistensi operasi DML campuran, terutama untuk penulisan data, sehingga menjadikan Hologres cocok untuk skenario pemrosesan transaksional (TP) ringan. Perlu diperhatikan bahwa transaksi yang berisi pernyataan DML campuran tidak dapat memanfaatkan sepenuhnya kemampuan terdistribusi Hologres dan oleh karena itu tidak mendukung skenario Queries Per Second (QPS) tinggi.
-
Skenario: Gunakan pernyataan DML campuran dalam satu transaksi yang sama untuk memastikan konsistensi saat menulis, memperbarui, dan menghapus data.
-
Catatan:
-
Transaksi DML campuran hanya mendukung skenario QPS rendah dan tidak cocok untuk situasi konkurensi tinggi. Untuk menentukan QPS spesifik yang didukung, Anda harus melakukan eksperimen sesuai kebutuhan.
-
Jika suatu transaksi mencakup operasi tulis dan kueri sekaligus, performa kueri lebih rendah dibandingkan saat transaksi tidak digunakan. Besarnya loss performa bervariasi tergantung pada skenario.
-
Dalam satu transaksi yang sama, operasi baca, tulis, hapus, dan perbarui semuanya mengakuisisi write lock tingkat tabel. Hal ini menyebabkan beberapa transaksi pada tabel yang sama dieksekusi secara sekuensial. Contohnya:
PentingCatatan: Lock tidak hanya diakuisisi pada tabel yang sedang ditulis, tetapi juga pada tabel yang sedang dikueri. Sebagai contoh:
-
User A mengeksekusi SQL berikut:
SET hg_experimental_enable_transaction = on; BEGIN; DELETE FROM dml_test; INSERT INTO dml_test SELECT * FROM base_tbl; COMMIT; -
User B mengeksekusi SQL berikut:
SET hg_experimental_enable_transaction = on; BEGIN; DELETE FROM dml_test_2; INSERT INTO dml_test_2 SELECT * FROM base_tbl; COMMIT;
Dalam kasus ini, base_tbl juga terkunci. Pernyataan SQL yang dikirimkan oleh User B harus menunggu hingga pernyataan SQL dari User A selesai dieksekusi terlebih dahulu. Oleh karena itu, setelah Anda mengaktifkan transaksi untuk multiple pernyataan DML, waktu eksekusi SQL meningkat secara signifikan jika terjadi konflik. Hal ini bahkan dapat menyebabkan error akibat pengaturan timeout.
-
-
-
Instruksi Penggunaan
Transaksi untuk pernyataan DML campuran dinonaktifkan secara default. Anda dapat mengaktifkan fitur ini dengan menggunakan parameter Grand Unified Configuration (GUC) berikut:
SET hg_experimental_enable_transaction = on;Setelah fitur ini diaktifkan, satu transaksi dapat mencakup beberapa pernyataan DML:
-
Jika suatu pernyataan DML gagal, sistem secara otomatis melakukan rollback terhadap semua pernyataan DML lain dalam transaksi tersebut.
-
Jika suatu pernyataan DML dieksekusi dengan sukses tetapi Anda ingin melakukan rollback, Anda dapat membatalkan seluruh transaksi. Aksi ini secara otomatis akan melakukan rollback terhadap semua pernyataan DML dalam transaksi tersebut.
SET hg_experimental_enable_transaction = on; BEGIN; DELETE FROM dml_test; INSERT INTO dml_test VALUES (1,'sss'); ROLLBACK;
-
-
-
Transaksi yang berisi pernyataan DDL dan DML sekaligus tidak didukung.
Contoh berikut menunjukkan error yang dilaporkan ketika pernyataan DDL dan DML berada dalam satu transaksi yang sama:
ERROR: INSERT in ddl transaction is not supported now.BEGIN; DROP TABLE IF EXISTS dml_test; CREATE TABLE dml_test ( uid TEXT NOT NULL, name TEXT NOT NULL); INSERT INTO dml_test VALUES('1','tom'); COMMIT;