All Products
Search
Document Center

PolarDB:Kontrol Konkurensi

Last Updated:Apr 24, 2026

Kontrol Konkurensi (CCL) adalah fitur yang disediakan oleh Alibaba Cloud untuk memastikan stabilitas operasi kluster PolarDB Anda selama lonjakan lalu lintas mendadak, eksekusi pernyataan SQL ber-resource tinggi, atau perubahan pada pola akses. CCL menggunakan aturan berbasis pernyataan SQL dan dapat dikelola melalui toolkit DBMS_CCL.

Prasyarat

Kluster PolarDB Anda harus menggunakan salah satu versi berikut:

  • PolarDB for MySQL 8.0.

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

    Catatan

    Jika kluster Anda adalah PolarDB for MySQL 5.7 dengan versi mesin minor 5.7.1.0.27 atau lebih baru, CCL kompatibel dengan Thread Pool.

  • PolarDB for MySQL 5.6.

Catatan

Ubah aturan CCL hanya pada node primary. Perubahan tersebut akan disinkronkan secara otomatis ke node lainnya.

Desain fitur

Dimension features

CCL mendefinisikan lima fitur dimensi. Pernyataan SQL dicocokkan dengan aturan CCL berdasarkan fitur-fitur ini:

Dimension

Description

TYPE

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

SCHEMA

Nama database tempat operasi SQL dilakukan.

TABLE

Nama tabel atau view tempat operasi SQL dilakukan.

KEYWORD

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

DIGEST

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

How SQL statements are matched with CCL rules

  • Jika nilai DIGEST dalam aturan CCL kosong, metode pencocokannya adalah sebagai berikut:

    • Jika nilai DIGEST kosong dan nilai TYPE, SCHEMA, serta TABLE tidak kosong, aturan hanya berlaku jika TYPE, SCHEMA, dan TABLE dalam pernyataan SQL Anda semuanya sesuai dengan nilai yang sesuai dalam aturan CCL.

    • Jika nilai DIGEST kosong, nilai SCHEMA dan TABLE kosong, dan nilai TYPE tidak kosong, aturan hanya berlaku jika TYPE pernyataan SQL Anda sesuai dengan TYPE dalam aturan CCL.

    Catatan

    Jika nilai KEYWORD dalam aturan CCL tidak kosong, kata kunci tersebut juga diperiksa:

    • Jika satu kata kunci dikonfigurasi dalam aturan CCL, pencocokan berhasil jika pernyataan SQL mengandung kata kunci tersebut.

    • Jika beberapa kata kunci dikonfigurasi dalam aturan CCL, pencocokan berhasil hanya jika pernyataan SQL mengandung semua kata kunci yang dikonfigurasi. Urutan kata kunci dalam pernyataan SQL tidak berpengaruh.

  • Jika nilai DIGEST dalam aturan CCL tidak kosong, aturan hanya berlaku jika nilai SCHEMA dan DIGEST pernyataan SQL Anda sesuai dengan nilai yang sesuai dalam aturan CCL.

  • Jika nilai SCHEMA dalam aturan CCL kosong, aturan berlaku jika nilai DIGEST pernyataan SQL Anda sesuai dengan nilai DIGEST dalam aturan CCL.

Matching Order for SQL Statements and CCL Rules

Satu pernyataan SQL hanya dapat mencocokkan satu aturan CCL. Jika suatu pernyataan cocok dengan beberapa aturan, aturan dengan prioritas tertinggi yang digunakan. Prioritas ditentukan dalam urutan berikut. Jika beberapa aturan memiliki prioritas yang sama, aturan dengan ID lebih rendah yang digunakan.

  1. Cocokkan berdasarkan nilai DIGEST.

  2. Cocokkan berdasarkan TYPE, SCHEMA, dan TABLE.

  3. Cocokkan berdasarkan TYPE saja.

Parameter

Anda dapat mengubah parameter berikut di Konsol PolarDB. Untuk informasi lebih lanjut, lihat Setel parameter kluster dan node.

Parameter

Description

loose_ccl_mode

Perilaku pernyataan SQL ketika batas konkurensi terlampaui. Nilai yang valid:

  • WAIT (default): Pernyataan masuk antrian. Pernyataan tersebut menunggu pernyataan SQL lain selesai sebelum dijalankan.

  • REFUSE: Dilaporkan error.

Catatan

Parameter ini hanya didukung oleh PolarDB for MySQL 8.0. Untuk versi 5.6 dan 5.7, pernyataan langsung masuk antrian.

loose_ccl_max_waiting_count

Ketika parameter loose_ccl_mode diatur ke WAIT, ini adalah jumlah maksimum pernyataan SQL yang dapat masuk antrian untuk satu aturan CCL. Jika jumlah ini terlampaui, dilaporkan error.

Rentang nilai: 0 hingga 65536. Nilai default: 0.

Catatan

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

Tabel aturan CCL

PolarDB menggunakan tabel sistem bernama concurrency_control untuk menyimpan aturan CCL. Tabel ini dibuat secara otomatis oleh sistem saat startup, sehingga Anda tidak perlu membuatnya secara manual. Pernyataan CREATE untuk tabel sistem ini adalah sebagai berikut:

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;

Parameter dijelaskan dalam tabel berikut:

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

Batas konkurensi.

Catatan

Anda dapat mengatur Concurrency_count ke 0 untuk menerapkan blacklist SQL. Hal ini melarang jenis kueri ini dijalankan.

Keywords

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

State

Menunjukkan apakah aturan diaktifkan. Nilai yang valid:

  • Y (default): Aturan diaktifkan.

  • N: Aturan dinonaktifkan.

Ordered

Ketika beberapa kata kunci dikonfigurasi dalam Keywords, parameter ini menentukan apakah kata kunci tersebut harus dicocokkan sesuai urutan. Nilai yang valid:

  • N (default): Ketika beberapa kata kunci dikonfigurasi dalam Keywords, tidak perlu dicocokkan sesuai urutan.

  • Y: Ketika beberapa kata kunci dikonfigurasi dalam Keywords, harus dicocokkan sesuai urutan.

Digest

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

Digest_text

Fitur pernyataan SQL.

Extra

Informasi lainnya.

Mengelola aturan CCL

Untuk membantu Anda mengelola aturan CCL, PolarDB menyediakan enam prosedur tersimpan lokal berikut di DBMS_CCL.

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

    Syntax

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

    Example

    • Tambahkan aturan CCL untuk tipe SELECT. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');
    • Tambahkan aturan CCL untuk pernyataan SELECT yang mengandung kata kunci `key1`. Ketika konkurensi mencapai 20, pernyataan berikutnya masuk antrian atau melaporkan error.

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');
    • Tambahkan aturan CCL untuk pernyataan SELECT yang mengandung kata kunci `key1`, `key2`, dan `key3`. Urutan kata kunci tidak berpengaruh. Ketika konkurensi mencapai 20, pernyataan berikutnya masuk antrian atau melaporkan error.

      CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3');
    • Tambahkan aturan CCL untuk pernyataan SELECT pada tabel t dalam skema test. Ketika konkurensi pernyataan SELECT mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.

      CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 10, '');
  • add_ccl_digest_rule: Menambahkan aturan CCL yang dicocokkan berdasarkan nilai DIGEST.

    Catatan

    Prosedur tersimpan add_ccl_digest_rule hanya didukung pada versi engine database berikut:

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

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

    Syntax

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

    Example

    • Tambahkan aturan CCL yang mencocokkan pernyataan SQL SELECT * FROM t1. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.

      CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10);
    • Tambahkan aturan CCL yang mencocokkan pernyataan SQL SELECT * FROM t1 dalam skema test. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.

      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. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.

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

      Jika pernyataan SQL mengandung konstanta, pernyataan tersebut tetap dapat dicocokkan 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 yang dicocokkan berdasarkan nilai DIGEST. Prosedur ini menggunakan nilai DIGEST yang telah dihitung sebelumnya alih-alih pernyataan SQL.

    Catatan

    Prosedur tersimpan add_ccl_digest_rule_by_hash hanya didukung pada PolarDB for MySQL 8.0.1 dengan versi mesin minor 8.0.1.1.31 atau lebih baru.

    Syntax

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

    Example

    • Tambahkan aturan CCL yang mencocokkan nilai DIGEST 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.

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

      Nilai 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a adalah nilai DIGEST yang dihitung untuk SELECT * FROM t1. Anda dapat menghitung nilai ini dengan menjalankan perintah SELECT statement_digest("SELECT * FROM t1") atau memperolehnya dari modul lain.

    • Tambahkan aturan CCL untuk skema test yang mencocokkan nilai DIGEST 533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.

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

    Syntax

    dbms_ccl.del_ccl_rule(<Id>);

    Example

    Hapus aturan CCL dengan ID 15.

    CALL dbms_ccl.del_ccl_rule(15);

    Jika aturan yang ingin Anda hapus tidak ada, sistem melaporkan warning. Anda dapat menjalankan perintah SHOW WARNINGS; untuk melihat detail warning tersebut. Berikut contohnya:

    1. Hapus aturan CCL dengan ID 100.

      CALL dbms_ccl.del_ccl_rule(100);

      Outputnya adalah sebagai berikut:

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

      SHOW WARNINGS;

      Outputnya adalah sebagai berikut:

      +---------+------+----------------------------------------------------+
      | 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

    Sebagai contoh, Code untuk PolarDB for MySQL 8.0 adalah 7517, Code untuk PolarDB for MySQL 5.7 adalah 3267, dan Code untuk PolarDB for MySQL 5.6 adalah 3045.

  • show_ccl_rule: Menampilkan aturan CCL yang diaktifkan dalam memori.

    Syntax

    dbms_ccl.show_ccl_rule();

    Example

    CALL dbms_ccl.show_ccl_rule();

    Outputnya adalah sebagai berikut:

    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING  | 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

    Parameter MATCHED, RUNNING, dan WAITING dijelaskan sebagai berikut:

    • MATCHED: Jumlah kali aturan berhasil dicocokkan.

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

    • WAITING: Jumlah thread yang menunggu untuk dijalankan di bawah aturan ini.

  • Anda dapat menggunakan pernyataan UPDATE untuk mengubah ID aturan CCL guna menyesuaikan prioritasnya.

    Syntax

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

    Example

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

      CALL dbms_ccl.show_ccl_rule();

      Outputnya adalah sebagai berikut:

      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      | 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 menyesuaikan prioritas aturan CCL dengan ID 17. Ini mengubah ID menjadi 20.

      UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17;
    3. Jalankan perintah berikut untuk melihat aturan CCL yang diaktifkan setelah diperbarui.

      CALL dbms_ccl.show_ccl_rule();

      Outputnya adalah sebagai berikut:

      +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
      | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING  | 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 mengubah aturan CCL dengan memodifikasi tabel concurrency_control, Anda harus menjalankan perintah ini agar perubahan tersebut berlaku.

    Syntax

    dbms_ccl.flush_ccl_rule();

    Example

    Anda dapat menyesuaikan prioritas aturan tujuan dengan mengubah ID aturan CCL dalam pernyataan UPDATE.

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

    Outputnya adalah sebagai berikut:

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

    Jalankan perintah berikut agar pengaturan tersebut berlaku.

    CALL dbms_ccl.flush_ccl_rule();

    Outputnya adalah sebagai berikut:

    Query OK, 0 rows affected (0.00 sec)​

Pengujian fungsional

  1. Buat aturan CCL untuk tiga dimensi:

    CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, '');  // Untuk pernyataan SELECT pada tabel sbtest1 dalam database test, konkurensinya adalah 3.
    CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2');       // Untuk pernyataan SELECT yang mengandung kata kunci sbtest2, konkurensinya adalah 2.
    CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, '');            // Untuk pernyataan SELECT, konkurensinya adalah 2.
  2. Gunakan Sysbench untuk melakukan pengujian dengan konfigurasi berikut:

    • 64 thread

    • 4 tabel

    • select.lua

  3. Lihat konkurensi aturan:

    CALL dbms_ccl.show_ccl_rule();

    Outputnya adalah sebagai berikut:

    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    | ID   | TYPE   | SCHEMA | TABLE   | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING  | 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 konkurensi yang diharapkan.