目录

基本原理与用法

一定需要注意的点

其他补充

间隙锁的范围:

锁的介绍:

索引失效的常见场景:


基本原理与用法

MySQL在查询语句后面加上 for update ,例如

select * from student where id = 1 for update;

即为手动给读操作加上写锁(或者说给共享锁再加上排它锁)。因为是写锁,如果在此之前有另一个事务对此数据加了写锁,那么当前的查询事务会等待写锁被释放(比如提交或回滚)后再查询。作为解决并发问题的方案之一。

for update nowait:被锁时直接报错而不等待。

for update wait 3:被锁时等待3秒,超过3秒后如果数据还存在写锁,则报错。

一定需要注意的点

for update是根据where的索引情况进行加锁,根据具体情况,可能会产生:行级锁、间隙锁、表级锁。

  1. 当查询语句走主键/唯一键索引,且数据全部命中,锁住单行。(即使是范围查询,比如 where id in (1,2,3),如果都存在,也是只锁1,3,5三行)。
  2. 当查询语句走主键/唯一键索引,但数据部分命中,或都不命中;或走非唯一索引:用间隙锁,锁住区间行。
  3. 当查询语句不走索引,会用间隙锁把整张表锁住(但其实并不是表锁),因此要尽量避免索引失效的场景。

其他补充

间隙锁的范围:

假设数据是这样的

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. 范围查询的范围过大
  2. 联合索引时违背最左匹配原则
  3. 各种语法待试验....面经里写的那些感觉有的不太对,如:
    1. 1.有or必全有索引;
      2.复合索引未用左列字段;
      3.like以%开头;
      4.需要类型转换;
      5.where中索引列有运算;
      6.where中索引列使用了函数;
      7.如果mysql觉得全表扫描更快时(数据少);

MySQL for update 用法解析相关推荐

  1. mysql have_mysql having用法解析

    having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前.而 having子句在聚合后对组记录进行筛选. ...

  2. 转:mysql group by 用法解析(详细)

    group by 用法解析 group by语法可以根据给定数据列的每个成员对查询结果进行分组统计,最终得到一个分组汇总表. SELECT子句中的列名必须为分组列或列函数.列函数对于GROUP BY子 ...

  3. mysql union result,【经验】Mysql的UNION用法解析及TP中写法

    最近也是在写项目中碰到的这个问题,需要将两个SELECT查询结果组合起来进行分组排序,想到了用union方法,用TP的union操作根本无法完成复杂的union操作,于是搜罗了一下,先说一下union ...

  4. mysql中group by用法解析

    MysqL group by 用法解析 2013年03月08日 08:43:30 JavaDynamic 阅读数:25184 一.group by语法可以根据给定数据列的每个成员对查询结果进行分组统计 ...

  5. MySQL之事务 索引 锁_MySql 知识点之事务、索引、锁原理与用法解析

    本文实例讲述了MySql 知识点之事务.索引.锁原理与用法.分享给大家供大家参考,具体如下: 事务 事务概念 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎执行一组操作语句, ...

  6. mysql回滚用法_Mysql误操作后利用binlog2sql快速回滚的方法详解

    前言 在日常工作或者学习中,操作数据库时候难免会因为"大意"而误操作,需要快速恢复的话通过备份来恢复是不太可能的,下面这篇文章主要给大家介绍关于Mysql误操作后利用binlog2 ...

  7. mysql增量同步kafka_canal解析mysql的binlog实时推送到kafka

    今天整理一下以前写的一个kafka消费canal的demo,实现实时推送数据到kafka.首先先介绍一下canal,官网是这么说的: 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和 ...

  8. Linux下Mysql的查询用法

    Linux下Mysql的查询用法 一.Mysql的delete删除语法 1.删除数据库 2.删除数据库的表 二.查询数据 1.基本查询 2.条件查询 三.数据库插入数据 1.创建新表 2.插入数据 四 ...

  9. ON DUPLICATE KEY UPDATE 用法与说明

    ON DUPLICATE KEY UPDATE作用 先声明一点,ON DUPLICATE KEY UPDATE为Mysql特有语法,这是个坑 语句的作用,当insert的时候如果对应的记录已经存在,则 ...

最新文章

  1. oracle用户登录的认证方式
  2. [AHOI2009]中国象棋
  3. CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)
  4. 盛严谨,严谨,再严谨。_评估员工调查的统计严谨性
  5. ppython_Python pcom包_程序模块 - PyPI - Python中文网
  6. Hyperic HQ监控IBM WebSphere MQ
  7. 结构化分析方法是一种自下而上逐步求精的分析方法【软件项目管理】
  8. 【模拟遍历】剑指offer:替换空格
  9. Kali欺骗网关攻击Windows10截取数据
  10. MATLAB实现滚动密钥密码
  11. himall微信支付
  12. php判断访问客户端是手机,判断客户端是否手机访问
  13. 斗鱼封禁主播陈一发,新媒体有出路吗?
  14. 设置不显示桌面上的计算机图标不见了,显示桌面,教您显示桌面图标不见了如何恢复...
  15. Problem 1 : Multiples of 3 and 5
  16. 乐鑫esp8266学习rtos3.0笔记第11篇:详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印。
  17. 计算机具有理性和逻辑思维吗,我们的理性和逻辑思维能力真的有那么重要吗?...
  18. 罗德里格旋转和李群、李代数的指数映射的关系
  19. RC滤波 电阻电容的损耗计算方法
  20. ∑-Δ 型ADC原理

热门文章

  1. 网络工程师(交换机和路由器)
  2. 复制的数字签名_数字签名的安全性
  3. mysql把两个表语句_select语句将两个表连在一起查询---MySQL
  4. html把地图显示全屏显示,Openlayers实现地图全屏显示
  5. amd锐龙笔记本cpu怎么样_酷睿的最大敌人!AMD锐龙笔记本值得买吗?
  6. [ASP.NET入门随想十] 珍珠奶茶 ——服务器控件模型
  7. win10解决安装jdk过程中javac不是内部或外部命令办法
  8. 前端知识基础之Vue知识点串讲
  9. android 屏幕最小宽度_Android使用最小宽度限定符时最小宽度的计算
  10. 中国电子书市场谁将成犀利哥?