Jika kolom atau indeks ditambahkan ke tabel saat layanan berjalan, satu lock yang dibutuhkan sesaat bisa membuat semua request yang memakai tabel itu menunggu.
Mengapa Hotfix menambahkan kolom atau indeks ke tabel yang sedang dipakai layanan → Akibatnya Perubahan skema menunggu transaksi panjang yang sudah terbuka lebih dulu, dan semua request yang datang sesudahnya menunggu perubahan skema itu → Di layar Fitur yang memakai tabel itu (inventory, mail, dan sebagainya) berhenti total lalu timeout
Sesekali secara acak, Tepat setelah login atau maintenance
Penanggung jawab
Penanggung jawab utama Infrastruktur DB (Tim Infrastruktur) · Turut terlibat Pengembangan server (Tim Pengembang Game)
Tugas Tim Pengembang Game
Untuk hotfix yang berisi perubahan skema, sepakati jadwalnya dengan Infrastruktur DB, deploy lebih dulu kode yang tetap berjalan walaupun kolom baru belum ada.
Tugas Tim Infrastruktur
Pasang batas waktu tunggu lock yang pendek dan coba lagi jika gagal, jalankan saat tidak ada transaksi panjang, gunakan tools perubahan skema online, ubah tabel besar saat maintenance.
Di grafik
Naik seperti anak tangga · Jumlah sesi yang menunggu lock, latensi query pada tabel itu
Yang diperiksa
MySQL: hitung sesi dengan State Waiting for table metadata lock di SHOW PROCESSLIST, lalu cari sesi yang memblokir (blocking_pid) dengan sys.schema_table_lock_waits. PostgreSQL: periksa request dengan granted bernilai false dan AccessExclusiveLock di pg_locks, lalu cari sesi yang memblokir dengan pg_blocking_pids()
Cocok jika
Sejak perubahan skema dimulai, semua query yang memakai tabel itu menumpuk menunggu lock, dan di posisi paling depan ada transaksi yang belum selesai atau statement perubahan skema
Tidak cocok jika
Request yang menunggu hanya terpusat di baris tertentu, sedangkan baris lain di tabel yang sama diproses dengan lancar: lebih mungkin hot row (db-hot-row)
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Pelajari lebih lanjut
Saat skema diubah, MySQL memegang metadata lock sesaat, sedangkan PostgreSQL memegang table lock terkuat sesaat. Walaupun perubahannya sendiri selesai dalam sekejap, jika di depannya ada satu transaksi yang belum selesai, semua request di belakangnya menunggu.
Sumber
Online DDL Performance and ConcurrencyMySQL Online DDL pun membutuhkan exclusive metadata lock sesaat di tahap akhir; jika ada transaksi panjang, DDL menunggu, dan permintaan lock yang menunggu itu menahan semua transaksi di belakangnya
Server System VariablesMySQL lock_wait_timeout: batas waktu tunggu metadata lock, default 31.536.000 detik (1 tahun)