in Yazılım

Mysql deadlock debug etme

PhpUnit testlerini çalıştırırken testler anlamsız bir şekilde donup kalıyorudu. Mysql’i restart ettiğimde testlerin çalışmaya devam ettiğini farkettim. (Testlerin hepsi mysql gone away hatası vererek sonlanmıştı) Böylece sorunun MySql kaynaklı olduğundan emin oldum. Bir yerlerde açılan transaction kapanmadığından deadlock oluşuyordu. Deadlock ile ilgili ayrıntılara erişmek için aşağıdaki komutu kullandım.

Aldığım çıktıdan en son lock olan sorguyu gördüm ve ayrıca “Waiting for table metadata lock” şeklinde ek bir açıklamaya rastladım.

İlgili processleri sonlandırarak testlerin ilerlemesini sağladım. Process sonlandırmak için yukarıdaki komutun çıktısında elde ettiğiniz process’i kill etmeniz gerekiyor.

Bunun sayesinde hangi testin patladığını tespit edip testlerin sonlanmasını sağlayabildim. Hatanın temel sebebini bulmak için transactionun nerede açık kalıdğını bulmanız gerekiyor.