All Products
Search
Document Center

PolarDB:Kontrol konkurensi

Last Updated:Aug 27, 2026

Untuk memastikan stabilitas operasi kluster PolarDB, Anda dapat menggunakan fitur concurrency control (CCL) guna mengelola lonjakan lalu lintas database yang tiba-tiba, pernyataan SQL yang intensif sumber daya, serta perubahan pola akses SQL. PolarDB menyediakan toolkit DBMS_CCL untuk menyederhanakan pengelolaan fitur ini.

Prasyarat

Kluster PolarDB Anda harus menjalankan salah satu versi berikut:

  • PolarDB for MySQL 8.0.

  • PolarDB for MySQL 5.7 dengan versi revisi 5.7.1.0.6 atau lebih baru.

    Catatan

    Jika kluster Anda menjalankan PolarDB for MySQL 5.7 dengan versi revisi 5.7.1.0.27 atau lebih baru, fitur CCL kompatibel dengan fitur thread pool.

  • PolarDB for MySQL 5.6.

Catatan penggunaan

Anda hanya dapat memodifikasi aturan CCL pada node primary. Modifikasi tersebut akan disinkronkan secara otomatis ke semua node lainnya.

Cara kerja

Pencocokan dimensi

CCL menggunakan lima dimensi berikut untuk mencocokkan pernyataan SQL masuk terhadap suatu aturan:

Dimension

Description

TYPE

Tipe pernyataan SQL, seperti SELECT, UPDATE, INSERT, DELETE, atau DDL.

SCHEMA

Nama database tempat pernyataan SQL dijalankan.

TABLE

Nama tabel atau view tempat pernyataan SQL dijalankan.

KEYWORD

Kata kunci dalam pernyataan SQL. Anda dapat menentukan beberapa kata kunci dalam satu aturan CCL. Pisahkan dengan titik koma (;).

DIGEST

String hash yang dihasilkan dari pernyataan SQL. Untuk informasi selengkapnya, lihat STATEMENT_DIGEST().

Logika pencocokan

  • Jika nilai DIGEST dalam aturan CCL tidak ditentukan:

    • Jika nilai TYPE, SCHEMA, dan TABLE ditentukan, pernyataan SQL harus cocok dengan ketiga dimensi tersebut agar aturan berlaku.

    • Jika hanya nilai TYPE yang ditentukan, pernyataan SQL harus cocok dengan dimensi TYPE agar aturan berlaku.

    Catatan

    Jika dimensi KEYWORD juga ditentukan, pemeriksaan tambahan dilakukan:

    • Jika satu kata kunci ditentukan, pernyataan SQL harus mengandung kata kunci tersebut agar pencocokan berhasil.

    • Jika beberapa kata kunci ditentukan, pernyataan SQL harus mengandung semua kata kunci yang ditentukan agar pencocokan berhasil. Urutan kata kunci dalam pernyataan SQL tidak berpengaruh.

  • Jika nilai DIGEST dalam aturan CCL ditentukan, nilai DIGEST dari pernyataan SQL harus cocok dengan nilai DIGEST dalam aturan tersebut. Jika nilai SCHEMA juga ditentukan dalam aturan, nilai SCHEMA dari pernyataan juga harus cocok.

  • Jika nilai SCHEMA dalam aturan CCL tidak ditentukan, pernyataan SQL hanya perlu cocok dengan nilai DIGEST agar aturan berlaku.

Prioritas pencocokan

Satu pernyataan SQL hanya dapat cocok dengan satu aturan CCL. Jika suatu pernyataan cocok dengan beberapa aturan, PolarDB menerapkan aturan dengan prioritas tertinggi. Jika beberapa aturan memiliki prioritas yang sama, PolarDB menggunakan aturan dengan ID terkecil. Prioritas aturan didasarkan pada dimensi pencocokannya, dalam urutan menurun sebagai berikut:

  1. DIGEST

  2. TYPE, SCHEMA, dan TABLE

  3. Hanya TYPE

Parameter

Anda dapat memodifikasi parameter berikut di Konsol PolarDB. Untuk informasi selengkapnya, lihat Konfigurasi parameter kluster dan node.

Parameter

Description

loose_ccl_mode

Aksi yang diambil saat batas konkurensi terlampaui. Nilai yang valid:

  • WAIT (Default): Pernyataan SQL ditempatkan dalam antrian dan menunggu pernyataan lain selesai.

  • REFUSE: Mengembalikan error.

Catatan

Parameter ini hanya didukung untuk PolarDB for MySQL 8.0. Untuk versi 5.6 dan 5.7, sistem secara otomatis mengantrikan pernyataan.

loose_ccl_max_waiting_count

Saat loose_ccl_mode diatur ke WAIT, parameter ini menentukan jumlah maksimum pernyataan SQL yang diantrikan untuk satu aturan CCL. Sistem akan mengembalikan error jika batas ini terlampaui.

Nilai yang valid: 0 hingga 65536. Nilai default: 0.

Catatan

Parameter ini hanya didukung untuk PolarDB for MySQL 5.7 dan 8.0.

Tabel aturan CCL

PolarDB menyimpan aturan CCL dalam tabel sistem concurrency_control. Sistem membuat tabel ini secara otomatis saat startup, dan Anda tidak perlu membuatnya secara manual. Pernyataan CREATE TABLE berikut menunjukkan struktur tabel tersebut:

CREATE TABLE concurrency_control (
  Id bigint AUTO_INCREMENT NOT NULL,
  Type varchar(64),
  Schema_name varchar(64),
  Table_name varchar(64),
  Concurrency_count bigint NOT NULL,
  Keywords text,
  State enum('N','Y') COLLATE utf8_general_ci DEFAULT 'Y' NOT NULL,
  Ordered enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
  Digest varchar(64),
  Digest_text longtext,
  Extra mediumtext,
  PRIMARY KEY Rule_id(id)
) Engine=InnoDB STATS_PERSISTENT=0 CHARACTER SET utf8 COLLATE utf8_bin
  comment='Concurrency control' TABLESPACE=mysql;

Tabel berikut menjelaskan parameter dalam tabel concurrency_control.

Parameter

Description

Id

ID aturan CCL.

Type

Tipe pernyataan SQL, seperti SELECT, UPDATE, INSERT, DELETE, atau DDL.

Schema_name

Nama database.

Table_name

Nama tabel dalam database.

Concurrency_count

Jumlah maksimum pernyataan konkuren yang diizinkan oleh aturan.

Catatan

Anda dapat mengatur nilai Concurrency_count ke 0 untuk menerapkan blacklist SQL, yang memblokir eksekusi query yang cocok.

Keywords

Kata kunci yang akan dicocokkan. Pisahkan beberapa kata kunci dengan titik koma (;).

State

Menentukan apakah aturan diaktifkan. Nilai yang valid:

  • Y (Default): Aturan diaktifkan.

  • N: Aturan dinonaktifkan.

Ordered

Jika beberapa kata kunci ditentukan dalam bidang Keywords, parameter ini menentukan apakah kata kunci harus dicocokkan sesuai urutan yang ditentukan. Nilai yang valid:

  • N (Default): Kata kunci dalam bidang Keywords tidak perlu dicocokkan sesuai urutan.

  • Y: Kata kunci dalam bidang Keywords harus dicocokkan sesuai urutan.

Digest

String hash 64-byte yang dihasilkan dari Digest_text. Untuk informasi selengkapnya, lihat STATEMENT_DIGEST().

Digest_text

Digest pernyataan ternormalisasi dari pernyataan SQL.

Extra

Informasi tambahan.

Mengelola aturan CCL

PolarDB menyediakan enam prosedur tersimpan berikut dalam paket DBMS_CCL untuk mengelola aturan CCL:

  • add_ccl_rule: Menambahkan aturan CCL berdasarkan TYPE, SCHEMA, TABLE, dan KEYWORD.

    Sintaksis

    dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');

    Example

    • Tambahkan aturan CCL untuk pernyataan SELECT dengan jumlah konkurensi 10. Saat batas ini tercapai, sistem akan mengantrikan atau menolak pernyataan berikutnya.

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');
    • Tambahkan aturan CCL untuk pernyataan SELECT yang mengandung kata kunci key1, dengan jumlah konkurensi 20.

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');
    • Tambahkan aturan CCL untuk pernyataan SELECT yang mengandung kata kunci key1, key2, dan key3, dengan jumlah konkurensi 20. Kata kunci dapat muncul dalam urutan apa pun.

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3');
    • Tambahkan aturan CCL dengan TYPE sebagai SELECT, SCHEMA sebagai test, dan TABLE sebagai t. Saat jumlah konkurensi pernyataan SELECT mencapai 10, pernyataan akan diantrikan atau error dilaporkan.

      CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 10, '');
  • add_ccl_digest_rule: Menambahkan aturan CCL berdasarkan digest pernyataan.

    Catatan

    Versi mesin database berikut mendukung prosedur tersimpan add_ccl_digest_rule:

    • PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.31 atau lebih baru.

    • PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.12 atau lebih baru.

    Sintaksis

    dbms_ccl.add_ccl_digest_rule('<Schema_name>', '<Query>', <Concurrency_count>);

    Example

    • Tambahkan aturan CCL yang mencocokkan pernyataan SQL SELECT * FROM t1 untuk mengantrikan permintaan atau melaporkan error saat jumlah konkurensi mencapai 10.

      CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10);
    • Tambahkan aturan CCL untuk skema test dan untuk pernyataan SQL yang cocok dengan SELECT * FROM t1 untuk mengantrikan permintaan atau melaporkan error saat jumlah konkurensi adalah 10.

      CALL dbms_ccl.add_ccl_digest_rule("test", "SELECT * FROM t1", 10);
    • Tambahkan aturan CCL yang mencocokkan pernyataan SQL SELECT * FROM t1 WHERE col1=1 untuk mengantrikan permintaan atau melaporkan error saat jumlah konkurensi adalah 10.

      CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1 WHERE col1 = 1", 10);
      Catatan

      Jika pernyataan SQL mengandung konstanta, pencocokan tetap terjadi meskipun nilai konstantanya berbeda. Misalnya, aturan CCL di atas juga mencocokkan pernyataan SQL SELECT * FROM t1 WHERE col1 = 2.

  • add_ccl_digest_rule_by_hash: Menambahkan aturan CCL berdasarkan hash digest yang telah dihitung sebelumnya.

    Catatan

    Prosedur tersimpan add_ccl_digest_rule_by_hash hanya didukung jika versi mesin PolarDB for MySQL adalah 8.0.1 dan versi revisinya 8.0.1.1.31 atau lebih baru.

    Sintaks

    dbms_ccl.add_ccl_digest_rule_by_hash('<Schema_name>', '<Digest>', <Concurrency_count>);

    Example

    • Tambahkan aturan CCL untuk pernyataan SQL yang nilai DIGEST-nya cocok dengan 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a untuk mengantrikan permintaan atau melaporkan error saat jumlah konkurensi adalah 10.

      CALL dbms_ccl.add_ccl_digest_rule_by_hash('', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);

      Dalam kasus ini, 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a adalah nilai DIGEST yang dihitung untuk SELECT * FROM t1. Anda dapat menggunakan perintah SELECT statement_digest("SELECT * FROM t1") untuk menghitung nilai ini atau memperolehnya dari modul lain.

    • Tambahkan aturan CCL untuk pernyataan SQL di mana SCHEMA adalah test dan nilai DIGEST pernyataan SQL cocok dengan 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a. Saat jumlah konkurensi mencapai 10, permintaan diantrikan atau error dikembalikan.

      CALL dbms_ccl.add_ccl_digest_rule_by_hash('test', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);
  • del_ccl_rule: Menghapus aturan CCL.

    Sintaks

    dbms_ccl.del_ccl_rule(<Id>);

    Example

    Hapus aturan CCL dengan ID 15.

    CALL dbms_ccl.del_ccl_rule(15);

    Jika aturan yang akan dihapus tidak ada, sistem akan melaporkan warning. Anda dapat menggunakan perintah SHOW WARNINGS; untuk melihat isi warning tersebut. Berikut contohnya:

    1. Hapus aturan CCL dengan ID 100.

      CALL dbms_ccl.del_ccl_rule(100);

      Output berikut dikembalikan:

      Query OK, 0 rows affected, 2 warnings (0.00 sec)
    2. Jalankan perintah berikut untuk melihat pesan warning:

      SHOW WARNINGS;

      Output berikut dikembalikan:

      +---------+------+----------------------------------------------------+
      | Level   | Code | Message                                            |
      +---------+------+----------------------------------------------------+
      | Warning | 7517 | Concurrency control rule 100 is not found in table |
      | Warning | 7517 | Concurrency control rule 100 is not found in cache |
      +---------+------+----------------------------------------------------+
    Catatan

    Pada contoh di atas, PolarDB for MySQL versi 8.0 memiliki Code 7517, PolarDB for MySQL versi 5.7 memiliki Code 3267, dan PolarDB for MySQL versi 5.6 memiliki Code 3045.

  • show_ccl_rule: Menampilkan aturan CCL yang diaktifkan dan saat ini berada di memori.

    Sintaks

    dbms_ccl.show_ccl_rule();

    Example

    CALL dbms_ccl.show_ccl_rule();

    Output berikut dikembalikan:

    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS |
    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    |   17 | SELECT | test   | t     | Y     | N     |                30 |       0 |       0 |        0 |          |
    |   16 | SELECT |        |       | Y     | N     |                20 |       0 |       0 |        0 | key1     |
    |   18 | SELECT |        |       | Y     | N     |                10 |       0 |       0 |        0 |          |
    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+​
    Catatan

    Tabel berikut menjelaskan kolom MATCHED, RUNNING, dan WAITTING.

    • MATCHED: Total jumlah kali aturan mencocokkan suatu pernyataan.

    • RUNNING: Jumlah thread yang sedang berjalan di bawah aturan ini.

    • WAITTING: Jumlah thread yang sedang menunggu untuk berjalan di bawah aturan ini.

  • Anda dapat menggunakan pernyataan UPDATE untuk memodifikasi ID aturan, yang mengubah prioritasnya.

    Sintaks

    UPDATE mysql.concurrency_control SET ID = xx WHERE ID = xx;

    Example

    1. Jalankan perintah berikut untuk melihat aturan CCL yang diaktifkan di memori:

      CALL dbms_ccl.show_ccl_rule();

      Output berikut dikembalikan:

      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS |
      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      |   17 | SELECT | test   | t     | Y     | N     |                30 |       0 |       0 |        0 |          |
      |   16 | SELECT |        |       | Y     | N     |                20 |       0 |       0 |        0 | key1     |
      |   18 | SELECT |        |       | Y     | N     |                10 |       0 |       0 |        0 |          |
      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    2. Jalankan perintah berikut untuk mengubah prioritas aturan CCL dengan ID 17 dengan mengubah ID-nya menjadi 20:

      UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17;
    3. Jalankan perintah berikut untuk melihat aturan yang telah dimodifikasi:

      CALL dbms_ccl.show_ccl_rule();

      Output berikut dikembalikan:

      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS |
      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      |   16 | SELECT |        |       | Y     | N     |                20 |       0 |       0 |        0 | key1     |
      |   18 | SELECT |        |       | Y     | N     |                10 |       0 |       0 |        0 |          |
      |   20 | SELECT | test   | t     | Y     | N     |                30 |       0 |       0 |        0 |          |
      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
  • flush_ccl_rule: Jika Anda memodifikasi aturan CCL dengan mengubah konten dalam tabel concurrency_control, Anda juga perlu menggunakan perintah berikut agar aturan tersebut berlaku.

    Sintaks

    dbms_ccl.flush_ccl_rule();

    Example

    Gunakan pernyataan UPDATE untuk mengubah jumlah konkurensi aturan.

    UPDATE mysql.concurrency_control SET CONCURRENCY_COUNT = 15 WHERE Id = 18;

    Output berikut dikembalikan:

    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0

    Jalankan perintah berikut untuk menerapkan perubahan:

    CALL dbms_ccl.flush_ccl_rule();

    Output berikut dikembalikan:

    Query OK, 0 rows affected (0.00 sec)​

Menguji fitur

  1. Buat tiga aturan CCL dengan dimensi pencocokan berbeda:

    CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, '');  // Batasi pernyataan SELECT pada tabel test.sbtest1 hingga konkurensi 3.
    CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2');       // Batasi pernyataan SELECT yang mengandung kata kunci 'sbtest2' hingga konkurensi 2.
    CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, '');            // Batasi semua pernyataan SELECT lainnya hingga konkurensi 2.
  2. Gunakan Sysbench untuk menjalankan pengujian dengan konfigurasi berikut:

    • 64 thread

    • 4 tabel

    • select.lua

  3. Lihat status konkurensi real-time:

    CALL dbms_ccl.show_ccl_rule();

    Output berikut dikembalikan:

    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    | ID   | TYPE   | SCHEMA | TABLE   | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS |
    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    |   20 | SELECT | test   | sbtest1 | Y     | N     |                 3 |     389 |       3 |        9 |          |
    |   21 | SELECT |        |         | Y     | N     |                 2 |     375 |       2 |       14 | sbtest2  |
    |   22 | SELECT |        |         | Y     | N     |                 2 |     519 |       2 |       34 |          |
    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    3 rows in set (0.00 sec)

    Periksa kolom RUNNING. Nilainya sesuai dengan batas konkurensi yang ditentukan, yang menunjukkan bahwa aturan berfungsi dengan benar.