mysql locking_Mysql next-key locking,读锁,写锁
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,读锁,写锁相关推荐
- MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁
MySQL - 行锁 表锁 乐观锁 悲观锁 读锁 写锁 锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足.在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(I ...
- oracle中key,mysql中的key在oracle中是什么
mysql中的key在oracle中是什么 说明一下.key在oracle中对应的是什么? 比如说: CREATE TABLE `AdBanner` ( `BannerId` int(8) NOT N ...
- 深入mysql ON DUPLICATE KEY UPDATE 语法的分析
mysql "ON DUPLICATE KEY UPDATE" 语法 如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNI ...
- mysql中的key和UNIQUE关键字
#mysql中的key和UNIQUE关键字# CREATE TABLE testTable( id INT KEY, #使用key关键字 email VARCHAR(50) UNIQUE, #使用UN ...
- mysql存储value_MySQL key/value存储方案(转)
需求 250M entities, entities表共有2.5亿条记录,当然是分库的. 典型解决方案:RDBMS 问题:由于业务需要不定期更改表结构,但是在2.5亿记录的表上增删字段.修改索引需要锁 ...
- Mysql存储引擎Innodb的读写锁、行级锁
读写锁 Mysql存储引擎Innodb在处理并发读或者写的时候,通过两种类型的锁来解决并发问题,这两种锁通常称为共享锁和排他锁,也叫读锁和写锁. 读锁是共享的,即多个客户端可以同时读取同一资源. 写锁 ...
- MySQL中的事务及读写锁实现并发访问控制
一.并发控制中锁的概念 锁是并发控制中最核心的概念之一,在MySQL中的锁分两大类,一种是读锁,一种是写锁,读锁也可以称为共享锁(shared lock),写锁也通常称为排它锁(exclusive l ...
- mysql无法生成备份产生读锁_mydumper 备份原理和使用方法(备份mysql)
一:我的使用环境:CentOS6.5 + Mysql5.7 MySQL备份工具比较: 1.mysqldump:属于逻辑备份,会存在锁表,但考虑到数据量比较大,锁表的时间会比较长,业务不允许,pass ...
- mysql json匹配key为数值_干货篇:一篇文章让你——《深入解析MySQL索引原理》
概述 最近一段时间重新深入研究了一遍MySQL的内容,今天主要分享分析MySQL索引原理,后续会输出一些关于MySQL方面的干货,希望各位小伙伴喜欢. 一.什么是索引.为什么要建立索引? 关于索引的理 ...
最新文章
- 徒手撸出一个类Flask微框架(三)根据业务进行路由分组
- 如何简单学会ajax,学会自己封装简单AJAX
- python网课一般多少钱-Python培训网课一般学费多少?毕业生能承担吗?
- 无人超市不便宜 一包棒棒糖比传统超市贵5.7元
- 在linux操作系统中启动oracle数据库程序,Linux系统下Oracle数据库的安装和启动关闭操作教程...
- FFmpeg non-existing PPS 0 referenced问题描述
- linux脚本输出缓存上限,关于 Linux 下后台执行 Python 脚本的缓冲问题
- pandas系列 read_csv 与 to_csv 方法各参数详解(全,中文版)
- Oracle 11g简体中文版的安装过程及图解
- 威纶触摸屏宏指令编程,字符串相关函数介绍与使用...
- saas平台产品使用合同(模板)
- php字体颜色代码大全,CSS中关于文本字体颜色(CSS color)的详解
- Vue隐藏技能:运行时渲染用户写入的组件代码!
- 【软件】网梭浏览器v2.4.7 思路
- 本以为能躺着进华为,结果陆续收到京东/滴滴/爱奇艺offer的我迷茫了
- 基于Linux内核的纯手工极简系统研究
- CNN网络详细讲解,可视化图例解读
- windows上获取系统时间
- 用JS制作一个简易GPA计算器
- 喜闻乐见的「手算题」技巧3:巧用 Python
热门文章
- php 大数运算类,PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
- 【编译原理】让我们来构建一个简单的解释器(Let’s Build A Simple Interpreter. Part 3.)(python/c/c++版)(笔记)
- 【car】什么是购车落地价?买车是先谈裸车价还是其他方面?
- python numpy hstack() from shape_base.py (将数组水平堆叠)
- HDU-6290 奢侈的旅行 2018女赛 Dijkstra堆优化
- mysql的存储过程基本使用
- java jdbc脚本_关于java:使用MySQL和JDBC运行.sql脚本
- 每天学一点儿shell:linux常用快捷键
- linux如何挂载windows共享文件,linux如何挂载windows下的共享文件
- mysql 降序_MySQL 8 新特性之降序索引底层实现