Lock Monitoring Scripts

>>Script Language and Platform: SQL / MySQL
This sequence of scripts can help identify tables that are being blocked and quantify how many locks are happening in your database.

Author: Carlos Victor

	-- Who is blocking (BLOCKING_TRX_ID | BLOCKING_LOCK_ID)

SELECT  TRX.TRX_MYSQL_THREAD_ID,
 TRX.TRX_ISOLATION_LEVEL,
 TRX.TRX_STARTED,
 TRX.TRX_STATE,
 PROCESSLIST.USER,
 PROCESSLIST.HOST,
 PROCESSLIST.DB,
 PROCESSLIST.COMMAND,
 PROCESSLIST.TIME,
 PROCESSLIST.STATE,
 LOCK_WAITS.REQUESTING_TRX_ID,
 LOCK_WAITS.BLOCKING_TRX_ID,
 LOCK_WAITS.BLOCKING_LOCK_ID
FROM INFORMATION_SCHEMA.INNODB_LOCKS LOCKS,
     INFORMATION_SCHEMA.INNODB_TRX TRX,
     INFORMATION_SCHEMA.PROCESSLIST PROCESSLIST,
     INFORMATION_SCHEMA.INNODB_LOCK_WAITS LOCK_WAITS WHERE LOCKS.LOCK_TRX_ID = TRX.TRX_ID
  AND TRX.TRX_MYSQL_THREAD_ID = PROCESSLIST.ID;

-- Query #2

SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query, bl.lock_id blocking_lock_id, bl.lock_mode blocking_lock_mode, bl.lock_type blocking_lock_type, bl.lock_table blocking_lock_table, bl.lock_index blocking_lock_index, rl.lock_id waiting_lock_id, rl.lock_mode waiting_lock_mode, rl.lock_type waiting_lock_type, rl.lock_table waiting_lock_table, rl.lock_index waiting_lock_index FROM information_schema.INNODB_LOCK_WAITS w INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.INNODB_TRX r ON r.trx_id = w.requesting_trx_id INNER JOIN information_schema.INNODB_LOCKS bl ON bl.lock_id = w.blocking_lock_id INNER JOIN information_schema.INNODB_LOCKS rl ON rl.lock_id = w.requested_lock_id; 

-- Query #3

SELECT blocking_trx_id,COUNT(*), b.trx_query blocking_query, MIN(r.trx_wait_started) FROM information_schema.INNODB_LOCK_WAITS w INNER JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.INNODB_TRX r ON r.trx_id = w.requesting_trx_id INNER JOIN information_schema.INNODB_LOCKS bl ON bl.lock_id = w.blocking_lock_id INNER JOIN information_schema.INNODB_LOCKS rl ON rl.lock_id = w.requested_lock_id GROUP BY blocking_trx_id ORDER BY COUNT(*) DESC;


-- A list of blocking transactions

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS);

OR

SELECT INNODB_LOCKS.*
FROM INFORMATION_SCHEMA.INNODB_LOCKS
JOIN INFORMATION_SCHEMA.INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);


Disclaimer: We hope that the information on these script pages is valuable to you. Your use of the information contained in these pages, however, is at your sole risk. All information on these pages is provided “as -is”, without any warranty, whether express or implied, of its accuracy, completeness, or fitness for a particular purpose… Disclaimer Continued

Back to Database Journal Home

Get the Free Newsletter!

Subscribe to Cloud Insider for top news, trends & analysis

Latest Articles