Saya mencoba untuk melakukan beberapa DDL di atas meja dan SHOW PROCESSLIST
menghasilkan pesan "Menunggu kunci metadata tabel".
Bagaimana cara mengetahui transaksi mana yang belum ditutup?
Saya menggunakan MySQL v5.5.24.
Jawaban:
SHOW ENGINE INNODB STATUS \G
Cari Bagian -
TRANSACTIONS
Kita dapat menggunakan Tabel INFORMATION_SCHEMA .
Kueri Berguna
Untuk memeriksa tentang semua transaksi kunci menunggu:
USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;
Daftar transaksi pemblokiran:
SELECT *
FROM INNODB_LOCKS
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);
ATAU
SELECT INNODB_LOCKS.*
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);
Daftar kunci di meja tertentu:
SELECT * FROM INNODB_LOCKS
WHERE LOCK_TABLE = db_name.table_name;
Daftar transaksi yang menunggu kunci:
SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';
Referensi - Pemecahan Masalah MySQL: Apa yang Harus Dilakukan Saat Kueri Tidak Berfungsi , Bab 6 - Halaman 96.
Jika Anda tidak dapat menemukan proses mengunci meja (karena sudah mati), mungkin ada utas yang masih dibersihkan seperti ini
bagian TRANSAKSI
show engine innodb status;
pada akhirnya
---TRANSACTION 1135701157, ACTIVE 6768 sec
MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up
seperti yang disebutkan dalam komentar di Hapus transaksi buntu?
Anda dapat mencoba mematikan utas transaksi secara langsung, di sini dengan
KILL 5208136;
bekerja untuk saya.
Saya mengalami masalah serupa dengan Datagrip dan tidak ada solusi yang berhasil.
Setelah saya memulai ulang Klien Datagrip, itu tidak lagi menjadi masalah dan saya dapat membatalkan tabel lagi.
INFORMATION_SCHEMA
database.