Jawaban:
Lihat tautan Marko untuk tabel InnoDB dan peringatan.
Untuk MyISAM, tidak ada solusi mudah "ini adalah permintaan yang menyinggung". Anda harus selalu memulai dengan daftar proses. Tetapi pastikan untuk memasukkan kata kunci lengkap sehingga pertanyaan yang dicetak tidak terpotong:
SHOW FULL PROCESSLIST;
Ini akan menampilkan daftar semua proses saat ini, kueri dan status SQL mereka. Sekarang biasanya jika satu permintaan menyebabkan banyak orang lain untuk mengunci maka itu harus mudah diidentifikasi. Kueri yang terpengaruh akan memiliki status Locked
dan kueri menyinggung akan duduk dengan sendirinya, mungkin menunggu sesuatu yang intensif, seperti tabel sementara.
Jika tidak jelas maka Anda harus menggunakan kekuatan deduksi SQL Anda untuk menentukan bagian SQL yang menyinggung yang mungkin menjadi penyebab kesengsaraan Anda.
Jika Anda menggunakan InnoDB dan perlu memeriksa menjalankan kueri saya sarankan
show engine innodb status;
seperti yang disebutkan dalam tautan Marko. Ini akan memberi Anda permintaan penguncian, berapa banyak baris / tabel yang dikunci olehnya, dll. Lihat di bawah TRANSAKSI.
Masalah dengan menggunakan SHOW PROCESSLIST
adalah bahwa Anda tidak akan melihat kunci kecuali pertanyaan lain sedang antri.
Coba SHOW OPEN TABLES
:
show open tables where In_Use > 0 ;
Tidak ada jawaban yang dapat menunjukkan semua kunci yang saat ini dipegang.
Lakukan ini misalnya di mysql di terminal.
start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there
Jelas transaksi di atas memegang kunci, karena transaksi masih aktif. Tetapi tidak ada permintaan yang sedang terjadi saat ini dan tidak ada yang menunggu kunci di mana pun (setidaknya).
INFORMATION_SCHEMA.INNODB_LOCKS
kosong, yang masuk akal diberikan dokumentasi , karena hanya ada satu transaksi dan saat ini tidak ada yang menunggu kunci. Juga INNODB_LOCKS
sudah tidak digunakan lagi.
SHOW ENGINE INNODB STATUS
tidak berguna: someTable
tidak disebutkan sama sekali
SHOW FULL PROCESSLIST
kosong, karena pelakunya sebenarnya tidak menjalankan kueri sekarang.
Anda dapat menggunakan INFORMATION_SCHEMA.INNODB_TRX
, performance_schema.events_statements_history
dan performance_schema.threads
untuk mengekstraksi kueri yang pernah dieksekusi transaksi aktif di masa lalu seperti yang dijabarkan dalam jawaban saya yang lain , tetapi saya belum menemukan cara untuk melihat bahwa someTable
terkunci dalam skenario di atas.
Saran di jawaban lain sejauh ini tidak akan membantu setidaknya.
Penafian: Saya belum menginstal innotop dan saya tidak repot-repot. Mungkin itu bisa berhasil.
AFAIK masih belum ada cara asli di MYSQL, tapi saya menggunakan innotop . Ini gratis dan memiliki banyak fungsi lainnya.
Lihat juga tautan ini untuk informasi lebih lanjut tentang penggunaan alat innotop.
Referensi diambil dari pos ini.
Anda dapat menggunakan skrip di bawah ini:
SELECT
pl.id
,pl.user
,pl.state
,it.trx_id
,it.trx_mysql_thread_id
,it.trx_query AS query
,it.trx_id AS blocking_trx_id
,it.trx_mysql_thread_id AS blocking_thread
,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl
INNER JOIN information_schema.innodb_trx AS it
ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
ON it.trx_id = ilw.requesting_trx_id
AND it.trx_id = ilw.blocking_trx_id