可以通过检查 InnoDB_row_lock 状态变量来分析系统上的行锁的争夺情况:

mysql> show status like 'InnoDB_row_lock%'; 
+---------------------------------------+-------+
| Variable_name                               | Value |
+---------------------------------------+-------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time                    | 0 |
| Innodb_row_lock_time_avg          | 0 |
| Innodb_row_lock_time_max        | 0 |
| Innodb_row_lock_waits                  | 0 |
+----------------------------------------+-------+
5 rows in set (0.01 sec)

对各个状态量的说明如下:
Innodb_row_lock_current_waits :当前正在等待锁定的数量;
Innodb_row_lock_time :从系统启动到现在锁定总时间长度;(等待总时长)(重要)
Innodb_row_lock_time_avg :每次等待所花平均时间;(等待平均时长)(重要)
Innodb_row_lock_time_max :从系统启动到现在等待最常的一次所花的时间;
Innodb_row_lock_waits :系统启动后到现在总共等待的次数;(等待总次数)(重要)

其他监控方法

MySQL 把事务和锁的信息记录在了 information_schema 库中,涉及到的三张表分别是
INNODB_TRXINNODB_LOCKSINNODB_LOCK_WAITS

MySQL 8.0,删除了 INNODB_LOCKSINNODB_LOCK_WAITS 表,并添加了 performance_schmea 数据库和其中的 data_locksdata_lock_waits 表。

performance_schema.data_locks 不但可以看到阻塞该事务的锁,还可以看到该事务所持有的锁。