Agregasi ranking, pengiriman mail massal, dan pembersihan data lama yang dijalankan saat layanan berjalan menahan lock dan menyita kapasitas disk.
Mengapa Pekerjaan berskala besar dijalankan pada jam layanan → Akibatnya Lock dengan cakupan luas, disk dan CPU tersita → Di layar Trade dan penyimpanan gagal pada jam tertentu, loading tertunda
Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Infrastruktur DB (Tim Infrastruktur)
Tugas Tim Pengembang Game
Pecah pekerjaan menjadi potongan kecil dan jalankan sedikit demi sedikit, jalankan agregasi di replika.
Tugas Tim Infrastruktur
Sediakan replika khusus agregasi, jadwalkan batch job di jam sepi, pantau lock escalation dan waktu tunggu gap lock.
Di grafik
Melonjak secara berkala · Latensi query DB, waktu tunggu lock
Yang diperiksa
Cari query panjang yang berjalan pada waktu lag. Periksa slow query log (MySQL) atau query_start dan query di pg_stat_activity (PostgreSQL), lalu cocokkan dengan metrik waktu tunggu lock pada waktu yang sama dan jadwal batch (cron, event scheduler DB). Di SQL Server, catat lock escalation dengan extended event lock_escalation
Cocok jika
UPDATE, DELETE, atau query agregasi berskala besar berjalan pada jam yang sama setiap kali, dan selama itu waktu tunggu lock serta utilisasi disk naik bersamaan
Tidak cocok jika
Tidak ada query panjang pada waktu itu: lebih mungkin checkpoint (db-checkpoint) atau backup server (dk-backup)
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Pelajari lebih lanjut
Jika satu statement memegang lebih dari sekitar 5.000 row lock, SQL Server mengubahnya menjadi table lock (lock escalation). Saat itu semua request yang memakai tabel yang sama tertahan. Dengan pengaturan default, MySQL juga mengunci celah di antara baris (gap lock) saat data diubah dengan kondisi rentang, sehingga baris baru tidak bisa ditambahkan.
Sumber
Transaction Locking and Row Versioning GuideMicrosoft SQL Server Jika satu statement memegang 5.000 lock atau lebih pada satu tabel (atau indeks), terjadi lock escalation; dicatat dengan extended event lock_escalation
InnoDB LockingMySQL Pada isolation level default InnoDB, yaitu REPEATABLE READ, pencarian dan scan memakai next-key lock, sehingga gap lock mencegah penambahan baris baru di celah tersebut
The Slow Query LogMySQL Mencatat query yang melebihi long_query_time beserta waktu eksekusi (Query_time), waktu lock (Lock_time), dan jumlah baris yang dibaca