MySQL for update 用法解析
目录
基本原理与用法
一定需要注意的点
其他补充
间隙锁的范围:
锁的介绍:
索引失效的常见场景:
基本原理与用法
MySQL在查询语句后面加上 for update ,例如
select * from student where id = 1 for update;
即为手动给读操作加上写锁(或者说给共享锁再加上排它锁)。因为是写锁,如果在此之前有另一个事务对此数据加了写锁,那么当前的查询事务会等待写锁被释放(比如提交或回滚)后再查询。作为解决并发问题的方案之一。
for update nowait:被锁时直接报错而不等待。
for update wait 3:被锁时等待3秒,超过3秒后如果数据还存在写锁,则报错。
一定需要注意的点
for update是根据where的索引情况进行加锁,根据具体情况,可能会产生:行级锁、间隙锁、表级锁。
- 当查询语句走主键/唯一键索引,且数据全部命中,锁住单行。(即使是范围查询,比如 where id in (1,2,3),如果都存在,也是只锁1,3,5三行)。
- 当查询语句走主键/唯一键索引,但数据部分命中,或都不命中;或走非唯一索引:用间隙锁,锁住区间行。
- 当查询语句不走索引,会用间隙锁把整张表锁住(但其实并不是表锁),因此要尽量避免索引失效的场景。
其他补充
间隙锁的范围:
假设数据是这样的
id | name |
2 | a |
6 | b |
9 | c |
如果对id=2的数据上间隙锁,则范围是:(-∞,2]、(2,6]
如果对id=6的数据上间隙锁,则范围是:(2,6]、(6,9]
如果对id=9的数据上间隙锁,则范围是:(6,9]、(9,+∞)
另外,开区间的范围是根据主键的排列顺序确定。
详细可看官网:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-gap-locks
锁的介绍:
MyISAM是表级锁,InnoDB默认行级锁,也支持表级锁。
间隙锁只有在InnoDB的RR-可重复读、Serializable级别时才默认支持。
索引失效的常见场景:
- 范围查询的范围过大
- 联合索引时违背最左匹配原则
- 各种语法待试验....面经里写的那些感觉有的不太对,如:
- 1.有or必全有索引;
2.复合索引未用左列字段;
3.like以%开头;
4.需要类型转换;
5.where中索引列有运算;
6.where中索引列使用了函数;
7.如果mysql觉得全表扫描更快时(数据少);
- 1.有or必全有索引;
MySQL for update 用法解析相关推荐
- mysql have_mysql having用法解析
having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前.而 having子句在聚合后对组记录进行筛选. ...
- 转:mysql group by 用法解析(详细)
group by 用法解析 group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表. SELECT子句中的列名必须为分组列或列函数.列函数对于GROUP BY子 ...
- mysql union result,【经验】Mysql的UNION用法解析及TP中写法
最近也是在写项目中碰到的这个问题,需要将两个SELECT查询结果组合起来进行分组排序,想到了用union方法,用TP的union操作根本无法完成复杂的union操作,于是搜罗了一下,先说一下union ...
- mysql中group by用法解析
MysqL group by 用法解析 2013年03月08日 08:43:30 JavaDynamic 阅读数:25184 一.group by语法可以根据给定数据列的每个成员对查询结果进行分组统计 ...
- MySQL之事务 索引 锁_MySql 知识点之事务、索引、锁原理与用法解析
本文实例讲述了MySql 知识点之事务.索引.锁原理与用法.分享给大家供大家参考,具体如下: 事务 事务概念 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎执行一组操作语句, ...
- mysql回滚用法_Mysql误操作后利用binlog2sql快速回滚的方法详解
前言 在日常工作或者学习中,操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2 ...
- mysql增量同步kafka_canal解析mysql的binlog实时推送到kafka
今天整理一下以前写的一个kafka消费canal的demo,实现实时推送数据到kafka.首先先介绍一下canal,官网是这么说的: 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和 ...
- Linux下Mysql的查询用法
Linux下Mysql的查询用法 一.Mysql的delete删除语法 1.删除数据库 2.删除数据库的表 二.查询数据 1.基本查询 2.条件查询 三.数据库插入数据 1.创建新表 2.插入数据 四 ...
- ON DUPLICATE KEY UPDATE 用法与说明
ON DUPLICATE KEY UPDATE作用 先声明一点,ON DUPLICATE KEY UPDATE为Mysql特有语法,这是个坑 语句的作用,当insert的时候如果对应的记录已经存在,则 ...
最新文章
- oracle用户登录的认证方式
- [AHOI2009]中国象棋
- CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)
- 盛严谨,严谨,再严谨。_评估员工调查的统计严谨性
- ppython_Python pcom包_程序模块 - PyPI - Python中文网
- Hyperic HQ监控IBM WebSphere MQ
- 结构化分析方法是一种自下而上逐步求精的分析方法【软件项目管理】
- 【模拟遍历】剑指offer:替换空格
- Kali欺骗网关攻击Windows10截取数据
- MATLAB实现滚动密钥密码
- himall微信支付
- php判断访问客户端是手机,判断客户端是否手机访问
- 斗鱼封禁主播陈一发,新媒体有出路吗?
- 设置不显示桌面上的计算机图标不见了,显示桌面,教您显示桌面图标不见了如何恢复...
- Problem 1 : Multiples of 3 and 5
- 乐鑫esp8266学习rtos3.0笔记第11篇:详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印。
- 计算机具有理性和逻辑思维吗,我们的理性和逻辑思维能力真的有那么重要吗?...
- 罗德里格旋转和李群、李代数的指数映射的关系
- RC滤波 电阻电容的损耗计算方法
- ∑-Δ 型ADC原理
热门文章
- 网络工程师(交换机和路由器)
- 复制的数字签名_数字签名的安全性
- mysql把两个表语句_select语句将两个表连在一起查询---MySQL
- html把地图显示全屏显示,Openlayers实现地图全屏显示
- amd锐龙笔记本cpu怎么样_酷睿的最大敌人!AMD锐龙笔记本值得买吗?
- [ASP.NET入门随想十] 珍珠奶茶 ——服务器控件模型
- win10解决安装jdk过程中javac不是内部或外部命令办法
- 前端知识基础之Vue知识点串讲
- android 屏幕最小宽度_Android使用最小宽度限定符时最小宽度的计算
- 中国电子书市场谁将成犀利哥?