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.
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.
INFORMATION_SCHEMA
database.Jika Anda tidak dapat menemukan proses mengunci meja (karena sudah mati), mungkin ada utas yang masih dibersihkan seperti ini
bagian TRANSAKSI
pada akhirnya
seperti yang disebutkan dalam komentar di Hapus transaksi buntu?
Anda dapat mencoba mematikan utas transaksi secara langsung, di sini dengan
bekerja untuk saya.
sumber
mysql 5.7 memperlihatkan informasi kunci metadata melalui
performance_schema.metadata_locks
tabel.Dokumentasi di sini
sumber
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.
sumber