All Products
Search
Document Center

ApsaraDB RDS:Kontrol timeout tunggu kunci DDL

Last Updated:May 13, 2026

RDS for MySQL mendukung kontrol timeout tunggu kunci DDL. Fitur ini memungkinkan Anda menggunakan petunjuk (hint) untuk mengatur durasi tunggu thread DDL dalam memperoleh kunci MDL, sehingga mencegah pemblokiran sesi dan penumpukan koneksi akibat waktu tunggu kunci yang terlalu lama.

Ikhtisar

Pendahuluan: Di MySQL, parameter lock_wait_timeout mengontrol timeout kunci MDL. Untuk mengatur waktu tunggu secara tepat pada operasi DDL tertentu, Anda harus mengubah parameter ini sebelum eksekusi. RDS for MySQL menyediakan cara yang lebih sederhana untuk mengontrol waktu tunggu kunci MDL pada pernyataan DDL individual: Anda dapat menentukan timeout langsung dalam pernyataan dengan menggunakan petunjuk /*+ WAIT(n) */ dan /*+ NO_WAIT() */.

Manfaat: Penggunaan petunjuk memberikan kompatibilitas yang lebih baik dibandingkan pengenalan sintaks baru. Petunjuk tersebut ditulis ke binlog sebagai komentar. Instans downstream atau layanan subscription yang tidak mendukung fitur ini akan secara otomatis mengabaikan petunjuk tersebut dan memperlakukannya sebagai komentar biasa. Hal ini mencegah error parsing SQL dan gangguan replikasi.

Cakupan

Fitur ini hanya tersedia untuk instans yang memenuhi persyaratan versi berikut. Jika instans Anda tidak memenuhi persyaratan ini, Anda dapat memperbarui versi mesin minor atau melakukan peningkatan versi database utama.

  • MySQL 8.4

  • MySQL 8.0 dengan versi mesin minor 20250531 atau lebih baru

Batasan berikut berlaku saat Anda menggunakan fitur ini:

  • Hanya operasi CREATE, DROP, ALTER, RENAME, TRUNCATE, dan OPTIMIZE yang didukung.

  • Petunjuk tersebut tidak berlaku pada node secondary atau instansi hanya baca selama replikasi dari node primary.

  • Pada petunjuk /*+ WAIT(n) */, n menentukan waktu tunggu dalam detik dan harus berada dalam rentang [0, 31536000].

Sintaks

Untuk operasi CREATE, DROP, ALTER, RENAME, TRUNCATE, dan OPTIMIZE, tambahkan petunjuk /*+ WAIT(n) */ atau /*+ NO_WAIT() */ segera setelah kata kunci untuk mengontrol waktu tunggu kunci MDL. Contoh:

-- Buat tabel t1 dan atur timeout MDL menjadi 10 detik.
CREATE /*+ WAIT(10) */ TABLE t1(a INT);

-- Tambahkan kolom ke tabel t1 tanpa menunggu kunci MDL.
ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;

-- Hapus tabel t1 dan atur timeout MDL menjadi 1 detik.
DROP /*+ WAIT(1) */ TABLE t1;

Contoh

Prosedur pengujian

  1. Buka sebuah sesi, buat tabel t1, dan peroleh kunci MDL S pada tabel tersebut.

    CREATE TABLE t1(a INT);
    LOCK TABLE t1 READ;
  2. Pada sesi kedua, coba ubah dan hapus tabel tersebut dengan menggunakan petunjuk /*+ WAIT(n) */ dan /*+ NO_WAIT() */, lalu amati hasilnya.

    ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;
    DROP /*+ WAIT(1) */ TABLE t1;

Hasil pengujian

Dengan petunjuk /*+ WAIT(n) */ dan /*+ NO_WAIT() */, operasi DDL gagal dengan cepat dan dapat diprediksi jika kunci tidak diperoleh dalam batas waktu yang ditentukan.

mysql> ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> DROP /*+ WAIT(1) */ TABLE t1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction