MySQL innodb的间隙锁定(next-key locking)是为了防止幻读(phantom read),

当MySQL的isolation level设为repeatable read的时候会触发间隙锁定。

这里先讨论 next-key locking 对 select 语句的锁定,不讨论 insert 等操作。

对于select 语句的锁定,总的来说就是:

next-key locking 将自己 查询过程中 所见到的那些行,全部都锁住。

推导一下:

1、如果查询过程中是用的全表扫描,则全表的记录都锁住

2、如果查询过程中是通过索引,则通过索引根据查询条件所匹配的那些记录都锁住,而且此时有新增的记录且该记录能 通过索引根据查询条件所匹配,则也会被锁住

3、如果查询过程中是通过唯一索引,其实情况和 普通索引一样

实例:

通过 name 和 owner 去查找 count:

@Lock(LockModeType.PESSIMISTIC_READ)public long countByNameAndOwner(String name,String owner);

查询语句为:

select count(id) from test where test.name='aaa' and test.owner='bbb' lock in share mode

1、如果查询没有使用到索引,则全表都锁住,不能 insert 、update 、delete

2、如果使用到索引,则将根据索引能查到的记录 锁住,这些记录任何字段不能修改,insert 的记录如果符合索引查出的条件,也将无法进行。

比如:

如果使用的是 name字段索引

将表中所有name为  ‘aaa’ 的记录锁住,如果新增 name为'aaa'的记录,也将无法进行。

如果是 insert 、update 、delete  字段name 不为 'aaa' 的记录,可正常操作。

如果是将 name为'aaa'的记录 的 name 修改为其他字符串,也会被锁住。

如果是使用 name,owner的复合索引,原理也是如上。

最后再来说下 读锁 和 写锁 的区别:

#写锁select * from test where id='1' for update;

#读锁select * from test where id='1' lock in share mode;

这里以 行锁为例进行说明:

写锁:

当记录上没有其他锁时(读锁,写锁),可以加写锁。

写锁会阻止其他锁,但不会阻止 纯粹的 select

insert、update、delete

# *********** 当记录上有写锁时     ***********

#下面语句会被阻止select * from test where id='1' for update;

#下面语句会被阻止select * from test where id='1' lock inshare mode;

#下面语句不会被阻止select * from test where id='1' ;

读锁:

当记录上没有写锁时,可以加读锁

当记录上有其他读锁时,可以再加读锁

记录上存在读锁,则写锁无法再加上,需要等所有的读锁都释放后才行

# *********** 当记录上有读锁时 ***********#下面语句会被阻止select * from test where id='1' for update;

#下面语句不会被阻止select * from test where id='1' lock inshare mode;

#下面语句不会被阻止select * from test where id='1' ;

InnoDB的 insert , update ,delete 的锁

对于insert 语句,新增的记录会关联到唯一索引、主键,在事务提交前,所有与该新增记录 主键相同,唯一索引约束项相同的记录都将被锁住。

对于update、delete语句,和上面类似,where条件将自己 查询过程中 所见到的那些行,全部都锁住。如果是没走索引,该表全部记录锁住。

mysql locking_Mysql next-key locking,读锁,写锁相关推荐

  1. MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁

    MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁 锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足.在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(I ...

  2. oracle中key,mysql中的key在oracle中是什么

    mysql中的key在oracle中是什么 说明一下.key在oracle中对应的是什么? 比如说: CREATE TABLE `AdBanner` ( `BannerId` int(8) NOT N ...

  3. 深入mysql ON DUPLICATE KEY UPDATE 语法的分析

    mysql "ON DUPLICATE KEY UPDATE" 语法 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNI ...

  4. mysql中的key和UNIQUE关键字

    #mysql中的key和UNIQUE关键字# CREATE TABLE testTable( id INT KEY, #使用key关键字 email VARCHAR(50) UNIQUE, #使用UN ...

  5. mysql存储value_MySQL key/value存储方案(转)

    需求 250M entities, entities表共有2.5亿条记录,当然是分库的. 典型解决方案:RDBMS 问题:由于业务需要不定期更改表结构,但是在2.5亿记录的表上增删字段.修改索引需要锁 ...

  6. Mysql存储引擎Innodb的读写锁、行级锁

    读写锁 Mysql存储引擎Innodb在处理并发读或者写的时候,通过两种类型的锁来解决并发问题,这两种锁通常称为共享锁和排他锁,也叫读锁和写锁. 读锁是共享的,即多个客户端可以同时读取同一资源. 写锁 ...

  7. MySQL中的事务及读写锁实现并发访问控制

    一.并发控制中锁的概念 锁是并发控制中最核心的概念之一,在MySQL中的锁分两大类,一种是读锁,一种是写锁,读锁也可以称为共享锁(shared lock),写锁也通常称为排它锁(exclusive l ...

  8. mysql无法生成备份产生读锁_mydumper 备份原理和使用方法(备份mysql)

    一:我的使用环境:CentOS6.5  + Mysql5.7 MySQL备份工具比较: 1.mysqldump:属于逻辑备份,会存在锁表,但考虑到数据量比较大,锁表的时间会比较长,业务不允许,pass ...

  9. mysql json匹配key为数值_干货篇:一篇文章让你——《深入解析MySQL索引原理》

    概述 最近一段时间重新深入研究了一遍MySQL的内容,今天主要分享分析MySQL索引原理,后续会输出一些关于MySQL方面的干货,希望各位小伙伴喜欢. 一.什么是索引.为什么要建立索引? 关于索引的理 ...

最新文章

  1. 徒手撸出一个类Flask微框架(三)根据业务进行路由分组
  2. 如何简单学会ajax,学会自己封装简单AJAX
  3. python网课一般多少钱-Python培训网课一般学费多少?毕业生能承担吗?
  4. 无人超市不便宜 一包棒棒糖比传统超市贵5.7元
  5. 在linux操作系统中启动oracle数据库程序,Linux系统下Oracle数据库的安装和启动关闭操作教程...
  6. FFmpeg non-existing PPS 0 referenced问题描述
  7. linux脚本输出缓存上限,关于 Linux 下后台执行 Python 脚本的缓冲问题
  8. pandas系列 read_csv 与 to_csv 方法各参数详解(全,中文版)
  9. Oracle 11g简体中文版的安装过程及图解
  10. 威纶触摸屏宏指令编程,字符串相关函数介绍与使用...
  11. saas平台产品使用合同(模板)
  12. php字体颜色代码大全,CSS中关于文本字体颜色(CSS color)的详解
  13. Vue隐藏技能:运行时渲染用户写入的组件代码!
  14. 【软件】网梭浏览器v2.4.7 思路
  15. 本以为能躺着进华为,结果陆续收到京东/滴滴/爱奇艺offer的我迷茫了
  16. 基于Linux内核的纯手工极简系统研究
  17. CNN网络详细讲解,可视化图例解读
  18. windows上获取系统时间
  19. 用JS制作一个简易GPA计算器
  20. 喜闻乐见的「手算题」技巧3:巧用 Python

热门文章

  1. php 大数运算类,PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
  2. 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 3.)(python/c/c++版)(笔记)
  3. 【car】什么是购车落地价?买车是先谈裸车价还是其他方面?
  4. python numpy hstack() from shape_base.py (将数组水平堆叠)
  5. HDU-6290 奢侈的旅行 2018女赛 Dijkstra堆优化
  6. mysql的存储过程基本使用
  7. java jdbc脚本_关于java:使用MySQL和JDBC运行.sql脚本
  8. 每天学一点儿shell:linux常用快捷键
  9. linux如何挂载windows共享文件,linux如何挂载windows下的共享文件
  10. mysql 降序_MySQL 8 新特性之降序索引底层实现