【MySQL】select for update 的Row Lock 与Table Lock

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: select for update 对表施加的锁模式分两种情况:只有当where 条件中明确地使用指定主键时,MySQL 才会对表执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。
select for update 对表施加的锁模式分两种情况:
只有当where 条件中明确地使用指定主键时,MySQL 才会对表执行Row lock (只锁住被选取的数据) ,
否则MySQL 将会执行Table Lock (将整个数据表单给锁住)。
下面以具体的实例验证上面的结论:
注意 表mail_queue 的结构如下
root@127.0.0.1 : test 22:06:52> show create table mail_queue \G
*************************** 1. row ***************************
       Table: mail_queue
Create Table: CREATE TABLE `mail_queue` (
  `mail_id` int(11) NOT NULL AUTO_INCREMENT,
  `is_sent` tinyint(4) NOT NULL COMMENT '是否已经发送(-1,失败,0没发送,1发送成功)',
  `mail_title` varchar(127) NOT NULL COMMENT '邮件标题',
  `mail_from` varchar(127) NOT NULL COMMENT '邮件发件人',
  `mail_to` varchar(127) NOT NULL COMMENT '邮件接收人',
  `mail_content` text NOT NULL COMMENT '邮件内容',
  `add_time` int(11) NOT NULL COMMENT '?'
  `send_time` int(11) NOT NULL COMMENT '?'
   `agent_id` int(11) NOT NULL COMMENT '?',
  `service_id` int(11) NOT NULL COMMENT 'ID',
  PRIMARY KEY (`mail_id`),
  KEY `ind_mq_atime_isent_mail_id` (`add_time`,`is_sent`,`mail_id`),
  KEY `sid` (`service_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7391601 DEFAULT CHARSET=utf8 COMMENT='邮件队列'
1 row in set (0.00 sec)
例1: (明确指定主键,并且有此数据,row lock)
session1
root@127.0.0.1 : test 21:50:40> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
root@127.0.0.1 : test 21:50:56> 
root@127.0.0.1 : test 21:50:56> select mail_id from mail_queue where mail_id=237 for update;
+---------+
| mail_id |
+---------+
|     237 |
+---------+
1 row in set (0.00 sec)

session2
root@127.0.0.1 : test 21:51:42> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
root@127.0.0.1 : test 21:51:48> select mail_id from mail_queue where mail_id=237;
+---------+
| mail_id |
+---------+
|     237 |
+---------+
1 row in set (0.00 sec)

例2: (明确指定主键,若查无此数据,无lock)
session 1
root@127.0.0.1 : test 22:06:05> select mail_id from mail_queue where mail_id=-1 for update;   
Empty set (0.00 sec)

session 2
root@127.0.0.1 : test 22:06:45> select mail_id,is_sent from mail_queue where mail_id=237 for update;
+---------+---------+
| mail_id | is_sent |
+---------+---------+
|     237 |       1 |
+---------+---------+
1 row in set (0.00 sec)
例3: (无主键,table lock)
mail_to 非主键
session 1
root@127.0.0.1 : test 22:09:20> select mail_to from mail_queue where mail_to='slxx_721521@126.com' for update;
+---------------------+
| mail_to             |
+---------------------+
| slxx_721521@126.com |
| slxx_721521@126.com |
| slxx_721521@126.com |
| slxx_721521@126.com |
| slxx_721521@126.com |
| slxx_721521@126.com |
| slxx_721521@126.com |
| slxx_721521@126.com |
| slxx_721521@126.com |
| slxx_721521@126.com |
+---------------------+
10 rows in set (50.23 sec)

session 2 查询被阻塞
root@127.0.0.1 : test 22:10:02> select mail_id,is_sent from mail_queue where mail_id=237 for update;
Ctrl-C -- sending "KILL QUERY 38535" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
root@127.0.0.1 : test 22:11:30> 
例4: (主键不明确,table lock)
session 1 
root@127.0.0.1 : test 22:11:48> select count(1) from mail_queue where mail_id 100000 for update;
+----------+
| count(1) |
+----------+
|  3695458 |
+----------+
1 row in set (27.45 sec)

session 2 会话被锁
root@127.0.0.1 : test 22:12:35> select mail_id,is_sent from mail_queue where mail_id=237 for update;
Ctrl-C -- sending "KILL QUERY 38535" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
root@127.0.0.1 : test 22:13:10> 

例5: (主键不明确,table lock)
session 1
root@127.0.0.1 : test 22:13:46> select count(1) from mail_queue where mail_id like '100000' for update;  
+----------+
| count(1) |
+----------+
|        0 |
+----------+
1 row in set (24.31 sec)
root@127.0.0.1 : test 22:14:22> 

session 2
root@127.0.0.1 : test 22:13:34> select mail_id,is_sent from mail_queue where mail_id=237 for update;
Ctrl-C -- sending "KILL QUERY 38535" to server ...
Ctrl-C -- query aborted.
ERROR 1317 (70100): Query execution was interrupted
注:FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。
  
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
16天前
|
人工智能 自然语言处理 关系型数据库
阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成
近日,阿里云云原生数据仓库 AnalyticDB PostgreSQL 版已完成和开源LLMOps平台Dify官方集成。
|
6天前
|
人工智能 分布式计算 数据管理
阿里云位居 IDC MarketScape 中国实时湖仓评估领导者类别
国际数据公司( IDC )首次发布了《IDC MarketScape: 中国实时湖仓市场 2024 年厂商评估》,阿里云在首次报告发布即位居领导者类别。
|
8天前
|
SQL 分布式计算 数据挖掘
加速数据分析:阿里云Hologres在实时数仓中的应用实践
【10月更文挑战第9天】随着大数据技术的发展,企业对于数据处理和分析的需求日益增长。特别是在面对海量数据时,如何快速、准确地进行数据查询和分析成为了关键问题。阿里云Hologres作为一个高性能的实时交互式分析服务,为解决这些问题提供了强大的支持。本文将深入探讨Hologres的特点及其在实时数仓中的应用,并通过具体的代码示例来展示其实际应用。
46 0
|
3月前
|
数据采集 运维 Cloud Native
Flink+Paimon在阿里云大数据云原生运维数仓的实践
构建实时云原生运维数仓以提升大数据集群的运维能力,采用 Flink+Paimon 方案,解决资源审计、拓扑及趋势分析需求。
18490 54
Flink+Paimon在阿里云大数据云原生运维数仓的实践
|
1月前
|
存储 机器学习/深度学习 监控
阿里云 Hologres OLAP 解决方案评测
随着大数据时代的到来,企业面临着海量数据的挑战,如何高效地进行数据分析和决策变得尤为重要。阿里云推出的 Hologres OLAP(在线分析处理)解决方案,旨在为用户提供快速、高效的数据分析能力。本文将深入探讨 Hologres OLAP 的特点、优势以及应用场景,并针对方案的技术细节、部署指导、代码示例和数据分析需求进行评测。
111 7
|
1月前
|
运维 数据挖掘 OLAP
阿里云Hologres:一站式轻量级OLAP分析平台的全面评测
在数据驱动决策的今天,企业对高效、灵活的数据分析平台的需求日益增长。阿里云的Hologres,作为一站式实时数仓引擎,提供了强大的OLAP(在线分析处理)分析能力。本文将对Hologres进行深入评测,探讨其在多源集成、性能、易用性以及成本效益方面的表现。
79 7
|
2月前
|
分布式计算 安全 OLAP
7倍性能提升|阿里云AnalyticDB Spark向量化能力解析
AnalyticDB Spark如何通过向量化引擎提升性能?
|
2月前
|
人工智能 分布式计算 数据管理
阿里云位居 IDC MarketScape 中国实时湖仓评估领导者类别
国际数据公司(IDC)首度发布《IDC MarketScape: 中国实时湖仓市场 2024 年厂商评估》,阿里云荣登领导者地位。报告评估了13家厂商,涵盖互联网、云服务及大数据领域。阿里云凭借其在实时湖仓领域的创新能力,特别是Apache Paimon及与Flink的集成,实现了高效流批处理和AI增强功能,为企业提供了一体化的湖仓解决方案,支持多种数据管理和AI应用场景,展现出了强大的市场领导力和技术实力。
130 8
|
3月前
|
存储 SQL 缓存
【报名中】阿里云 x StarRocks:极速湖仓第二季—上海站
阿里云 x StarRocks:极速湖仓第二季,7月20日阿里巴巴上海徐汇滨江园区,现场签到丰富奖品等你拿,不见不散!
309 7
【报名中】阿里云 x StarRocks:极速湖仓第二季—上海站
|
2月前
|
存储 运维 Cloud Native
"Flink+Paimon:阿里云大数据云原生运维数仓的创新实践,引领实时数据处理新纪元"
【8月更文挑战第2天】Flink+Paimon在阿里云大数据云原生运维数仓的实践
258 3

热门文章

最新文章