MySQL中select for update是锁表还是锁行
MySQL中select
关于MySQL中select的相关介绍,接下来就是全面介绍。
在并发一致性控制场景中,我们常常用for update悲观锁来进行一致性的保证,但是如果不了解它的机制,就进行使用,很容易出现事故。
比如for update进行了锁表导致其他请求只能等待,从而拖垮系统,因此了解它的原理是非常必要的。
下面我们通过一系列示例进行测试,来看看到底是什么场景下锁表什么场景下锁行
验证
示例说明
创建一个账户表,插入基础数据,以唯一索引、普通索引、主键、普通字段4 个维度进行select ... for update查询,查看是进行锁表还是锁行
表创建
创建一个账户表,指定account_no为唯一索引、id为主键、user_no为普通字段、curreny为普通索引
CREATE TABLE `account_info` (
`id` int NOT NULL AUTO_INCREMENT COMMENT 'ID' ,
`account_no` int NOT NULL COMMENT '账户编号',
`user_no` varchar(32) NOT NULL COMMENT '用户 Id',
`currency` varchar(10) NOT NULL COMMENT '币种',
`amount` DECIMAL(10,2) NOT NULL COMMENT '金额',
`freeze_amount` DECIMAL(10,2) NOT NULL COMMENT '冻结金额',
`create_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',
`update_time` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uni_idx_account_no` (`account_no`) ,
KEY `idx_currency_` (`currency`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账户信息表';
插入基础数据
insert into account_info values (1,1,'ur001','RMB',100,0,now(),now());
insert into account_info values (2,2,'ur002','RMB',1000,0,now(),now());
insert into account_info values (3,3,'ur002','DOLLAR',200,0,now(),now());
根据主键查询
在事务 1 中,根据主键id=1 进行 for update查询时,事务2、事务 3 都进行阻塞,而事务 4 由于更新的id=2 所以成功,因此判定,根据主键进行 for update 查询时是行锁

根据唯一索引查询
在事务 1 中,根据唯一索引account_no=1 进行 for update查询时,事务2、事务 3 都进行阻塞,而事务 4 由于更新的account_no=2 所以成功,因此判定,根据唯一索引进行 for update 查询时是行锁

根据普通索引查询
在事务 1 中,根据普通索引currency=’RMB’ 进行 for update查询时,事务2、事务 3 都进行阻塞,而事务 4 由于更新的currency=’DOLLAR`所以成功,因此判定,
相关阅读
-
做一个网站需要学什么专业 制作网站的学习方法
关于这方面的知识你知道吗?做一个网站需要学什么专业和制作网站的学习方法的IT小经验,下面来一起了解一下吧。 这个话题倒是可以聊聊,做网站基本会有两个方向。一个是纯商业方向,
-
网络基础之路:深入理解子网划分 深入探索子网划分的网络基础
本文为你详解网络基础之路的电脑方面的小经验,接下来IT袋网小编就来介绍。 子网划分的概念 子网划分,也称为子网化,是网络设计中的一个重要概念。 其主要目标是将一个大型网络划分为
-
网站被bing屏蔽 网站被必应(Bing)删除的原因和解决方法
由于微软Bing(必应)搜索引擎在国内的市场份额越来越高,这是每个网站SEO必须关注的事情,近期很多 网站被bing屏蔽 ,大部分的网站长搞不清楚 网站被必应(Bing)删除 的原因,下面IT袋小编就
-
虚拟化类型以及优缺点比较 虚拟化类型及其优缺点对比
正文核心导读:虚拟化类型以及优缺点比较的电脑小知识,具体详情如下: 1. 简介 虚拟化是一种将计算机硬件、操作系统、应用程序等资源进行抽象和隔离的技术。 虚拟化技术可以将一个物


