Jika semua orang ingin mengubah baris yang sama (gudang guild, item populer di balai lelang, counter untuk seluruh server), lock hanya didapat satu per satu.
Mengapa Perubahan menumpuk pada baris yang sama karena event atau item populer → Akibatnya Request menunggu sampai mendapat lock → Di layar Trade gagal, “Coba lagi nanti”, timeout
Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Infrastruktur DB (Tim Infrastruktur)
Tugas Tim Pengembang Game
Pecah barisnya (sharded counter), persingkat transaksi, kumpulkan perubahan di memori lalu terapkan sekaligus.
Tugas Tim Infrastruktur
Pantau waktu tunggu row lock dan jumlah kejadiannya, temukan baris yang paling diperebutkan, lalu bagikan.
Kisaran angka
Jika satu request memegang lock selama 10 ms, baris itu hanya bisa diubah maksimal 100 kali per detik. Jika di dalam transaksi ada round-trip ke server lain, angka itu makin kecil sebanding dengan lamanya.
Di grafik
Naik mengikuti beban · Jumlah dan waktu tunggu row lock
Yang diperiksa
MySQL: periksa kenaikan Innodb_row_lock_waits dan Innodb_row_lock_time serta Innodb_row_lock_current_waits, lalu cari siapa menunggu siapa dengan sys.innodb_lock_waits. PostgreSQL: periksa sesi dengan wait_event_type Lock di pg_stat_activity dan request dengan granted bernilai false di pg_locks; jika log_lock_waits (default nonaktif) diaktifkan, lock yang ditunggu lama tercatat di log
Cocok jika
Jumlah request yang menunggu lock naik tajam mengikuti event dan jumlah pemain, dan sebagian besar request yang menunggu mengarah ke baris yang sama (key yang sama) di tabel yang sama
Tidak cocok jika
Request yang menunggu tersebar merata di banyak tabel dan baris: lebih mungkin disk atau CPU jenuh. Satu sesi memegang lock lama dan tidak melepasnya: lebih mungkin transaksi yang terbuka lama (db-long-tx)
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Sumber
InnoDB LockingMySQL Jika satu transaksi mengunci sebuah baris (index record), transaksi lain tidak bisa mengubah baris itu dan harus menunggu
How to Minimize and Handle DeadlocksMySQL Anjuran untuk menjaga transaksi tetap kecil dan singkat serta segera commit setelah perubahan terkait agar konflik berkurang
Server Status VariablesMySQL Innodb_row_lock_waits dan Innodb_row_lock_time menunjukkan jumlah dan waktu tunggu row lock; Innodb_row_lock_current_waits menunjukkan jumlah yang sedang menunggu