加锁测试

0、准备

参考:MySQL 加锁处理分析

记得先打开innodb monitor中的锁详细信息输出。

set GLOBAL innodb_status_output=ON;
set GLOBAL innodb_status_output_locks=ON;

  

一、表结构及原始数据

DROP TABLE IF EXISTS test_lock;
CREATE TABLE `test_lock` (
`id` int(8) unsigned NOT NULL AUTO_INCREMENT,
`key_uniq` varchar(100) NOT NULL DEFAULT '',
`name_index` varchar(100) NOT NULL DEFAULT '',
`code_index` varchar(100) NOT NULL DEFAULT '',
`no_index` varchar(100) NOT NULL DEFAULT '',

PRIMARY KEY (`id`),
UNIQUE KEY `uniq_idx_key_uniq` (`key_uniq`),
KEY `idx_code` (`code_index`), KEY `idx_name` (`name_index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO test_lock (key_uniq, name_index, code_index, no_index ) VALUES ("uniq3", 'name3', 'code3', 'no5'),("uniq5", 'name1', 'code2', 'no3'),("uniq1", 'name5', 'code1', 'no4'),("uniq4", 'name2', 'code3', 'no1'),("uniq2", 'name4', 'code4', 'no2');

  

 

 

1uniq3name3code3no5
2uniq5name1code2no3
3uniq1name5code1no4
4uniq4name2code3no1
5uniq2name4code4no2

 

二、常用SQL

2.1 查看innodb锁信息

SHOW ENGINE INNODB STATUS \G

  

2.1 查看当前事务ID

select trx_id  from information_schema.INNODB_TRX where trx_mysql_thread_id = CONNECTION_ID();

  

三、update/delete 加锁

3.1 主键

这里只讨论聚簇索引的加锁。

3.1.1 point

行锁(lock_mode X locks rec but not gap)

3.1.2 不存在记录

大于该记录的有效记录加gap锁(lock_mode X locks gap before rec)。

3.1.3 range

范围内的每个有效记录加NK锁,最大的有效记录的下个记录也加NK锁。

 

3.2 唯一索引

这里只讨论唯一索引的加锁。

3.2.1 point

行锁(lock_mode X locks rec but not gap)

3.2.2 不存在记录

大于该记录的有效记录加gap锁(lock_mode X locks gap before rec)。

3.2.3 range

范围内的每个有效记录加NK锁,最大的有效记录的下个记录也加NK锁。

 

3.3 普通二级索引

这里只讨论普通二级索引的加锁。

一个索引可能对应多条记录。这里将每个记录称为索引子记录。

3.3.1 point

命中的所有索引子记录+NK锁,命中索引的下一个索引加gap锁(lock_mode X locks gap before rec)

相当于,命中索引加NK锁,下一个索引加gap锁。

3.3.2 不存在记录

大于该记录的有效记录加gap锁(lock_mode X locks gap before rec)。

3.3.3 range

范围内的每个有效子记录加NK锁,最大的有效记录的下个记录也加NK锁。

 

3.4 无索引

这里只讨论聚簇索引的加锁。

3.4.1 point

所有记录加NK锁,即全表锁。

3.4.2 不存在记录

所有记录加NK锁,即全表锁。

3.4.3 range

所有记录加NK锁,即全表锁。

 

3.5 总结

 聚簇索引/唯一索引普通二级索引无索引
point索引的行锁有效索引的NK+下一索引的NK(相当于range)全表
不存在下一索引的gap锁
range有效索引的NK+下一索引的NK

仅在唯一索引的point查询,才会从NK降级为行锁。

 

转载于:https://www.cnblogs.com/waterystone/p/5165363.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值