Cara mengenal pasti pertanyaan khusus yang memegang kunci apabila ralat melebihi masa menunggu Kunci melebihi berlaku dalam MySQL
Pengenalan:
Tamat masa menunggu kunci melebihi ralat dalam MySQL menunjukkan bahawa pertanyaan menemui tamat masa menunggu kunci semasa cuba mengakses sumber terkunci. Ini boleh berlaku dalam senario di mana berbilang pertanyaan mengakses data yang sama dan satu pertanyaan menyekat pelaksanaan yang lain disebabkan oleh kunci yang bercanggah. Menentukan pertanyaan khusus yang menyebabkan menunggu kunci boleh membantu dalam menyelesaikan isu dan mencegah kejadian pada masa hadapan.
Mengenal pasti Pertanyaan Penyebab:
Dalam log ralat, perkataan " transaksi" ialah penunjuk utama bahawa pertanyaan yang cuba mengakses pangkalan data sedang mengubah suai satu atau lebih InnoDB meja. Mengetahui pertanyaan yang mencetuskan ralat, adalah mungkin untuk mengenal pasti jadual yang terlibat.
Menggunakan arahan SHOW ENGINE INNODB STATUSG, anda boleh mendapatkan maklumat tentang jadual yang terjejas dan status penguncian. Perintah ini memaparkan maklumat terperinci, termasuk:
Contoh Output:
The berikutan output daripada SHOW ENGINE INNODB STATUSG menunjukkan bahawa pertanyaan khusus sedang menunggu kunci eksklusif pada lampiran jadual:
RW-excl spins: 787046, OS waits: 39353 ... Latest foreign key error (a full list is printed in the InnoDB error log when a foreign key error occurs): ... Transaction: TRANSACTION 0 606162814, ACTIVE 0 sec, process no 29956, OS thread id 1223895360 updating or deleting, thread declared inside InnoDB 499 mysql tables in use 1, locked 1 ... Foreign key constraint fails for table `backoffice`.`attachment`: , CONSTRAINT `attachment_ibfk_2` FOREIGN KEY (`file_id`) REFERENCES `file` (`file_id`) Trying to delete or update in parent table, in index `PRIMARY` tuple: ... But in child table `backoffice`.`attachment`, in index `PRIMARY`, there is a record:
Penyelesaian:
Untuk menyelesaikan isu, anda boleh meningkatkan nilai parameter innodb_lock_wait_timeout, yang menentukan masa maksimum transaksi akan menunggu kunci sebelum melaporkan ralat. Dengan meningkatkan tamat masa ini, anda boleh menyediakan lebih banyak masa penimbal untuk transaksi selesai dan mengurangkan kemungkinan ralat tamat masa kunci.
Menetapkan innodb_lock_wait_timeout:
Untuk menetapkan tamat masa secara kekal, tambahkan baris berikut pada /etc/my.cnf dan mulakan semula MySQL:
[mysqld] innodb_lock_wait_timeout=120
Untuk menetapkan tamat masa bagi sesi semasa, laksanakan pertanyaan berikut:
SET GLOBAL innodb_lock_wait_timeout = 120;
Atas ialah kandungan terperinci Bagaimana untuk Mengenalpasti Pertanyaan Khusus Menyebabkan Ralat 'Tamat masa menunggu kunci melebihi' dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!