查看锁

InnoDB INFORMATION_SCHEMA Lock Tables_风中清淡-CSDN博客

INNODB_LOCKS表包含有关InnoDB事务已请求但尚未获取的每个锁的信息,以及事务持有的阻止另一个事务的每个锁。
INNODB_LOCK_WAITS表包含每个被阻止的InnoDB事务的一行或多行,指示它已请求的锁以及阻止该请求的任何锁。

【注意】
这两个表从 MySQL 5.7.14 开始不推荐使用,并在 MySQL 8.0 中删除。

INNODB_TRX 表包含有关当前在 InnoDB 内执行的每个事务(不包括只读事务)的信息,包括事务是否在等待锁定,事务何时启动以及事务正在执行的 SQL 语句(如果有)。

这个还在。

MySQL 8 新查看锁方式

mysql - Why does ‘lock_type’ of information_schema.INNODB_LOCKS always RECORD? - Stack Overflow

8.0 开始使用

select * from performance_schema.data_locks;
select * from performance_schema.metadata_locks;

Lock_mode 字段

MySQL InnoDB锁类型 - 简书

data_locks 表中的 LOCK_MODE 字段:

3)索引记录锁(Record Locks),行级锁
也就是所谓的行锁,锁定的是索引记录,行锁就是索引记录锁, LOCK_MODE 分别是:S,REC_NOT_GAPX, REC_NOT_GAP

5)下一键锁(Next-Key Locks),行级锁,RR 特有
是特殊的 gap 锁,是索引值 record 锁和 gap 锁的合体。如果索引值命中多个,则都加上 nextKey。例如 i 值为 8-10-10-11-18,where i=10,那 2 个 i=10 的 nextKey 为 (8, 10] 和 (10, 10] 半开区间。
LOCK_MODE 分别是:SX。和 gap 不同的是,两种模式不等价,和记录锁类似,S 之间可以共存,S 和 X,X 和 X 之间不能共存,这点在重复键检查 (duplicate-key) 造成死锁时体现的很明显。

CREATE DEFINER=`root`@`%` PROCEDURE `test_insertdata`(IN `loopcount` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN
    declare v_uuid  varchar(50);
    while loopcount>0 do
        set v_uuid = uuid();
        insert into test_order (user_id,order_id,order_status,create_date) values (rand()*1000,id,rand()*10,DATE_ADD(NOW(), INTERVAL - RAND()*20000 HOUR));
        set loopcount = loopcount -1;
    end while;
END

在数据量不大的情况下。

Select xxx from xxx where 范围索引;不会上锁

Update xxx from xxx where 主键范围索引,第一个值行锁,其他值 next key lock

Update xxx from xxx where 非主键范围索引,非主键数据项 next key lock,主键数据线行锁

但是上面有表格 IX,不知道是不是表锁?》