MySQL 基础知识梳理学习(六)----锁
1.什么是锁:
对共享资源进行并发访问控制,提供数据的完整性和一致性。
2.锁的区别:
| 类型 | lock | latch |
| 对象 | 事务 | 线程 |
| 保护 | 数据库内容 | 内存数据结构 |
| 持续时间 | 整个事务过程 | 临界资源 |
| 模式 | 行锁、表锁、意向锁 | 读写锁、互斥量 |
| 死锁 | 通过waits-for graph、time out等机制进行死锁检测与处理 | 无死锁检测与处理机制。仅通过应用程序加锁的顺序(latch leveling)保证无死锁的情况发生。 |
| 存在于 |
Lock Manager的哈希表中 |
每个数据结构对象中 |
latch是针对程序内部的资源(比如:全局变量)的锁的定义,而这里的lock针对的是数据库的事务。
lock由latch来保证和实现。
3.锁是用来实现并发控制,并发控制用来实现隔离级别,隔离级别是通过锁来控制的,锁的目的为了使得事务之间的执行是序列化的。
4. 什么是隔离性
一个事务所做的修改,对其它事务时不可见的,好似是串行执行的。
隔离级别越低,事务请求的锁越少或者保持锁的时间就越短。
5.MySQL事务的隔离级别
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
| 读未提交(read-uncommitted) | 是 | 是 | 是 |
| 不可重复读(read-committed) | 否 | 是 | 是 |
| 可重复读(repeatable-read) | 否 | 否 | 是 |
| 串行化(serializable) | 否 | 否 | 否 |
MySQL 默认的事务隔离级别为repeatable-read。
6.什么是脏读、不可重复读、幻读
(1)脏读:事务A读取了事务B更新(插入)的数据,然后B回滚操作,那么A读取的数据是脏数据。即尚未提交(commit)的数据,被其他的事务读取了。
(2)不可重复读:事务A多次读取同一数据(同一条记录),事务B在事务A多次读取的过程中,对数据做了更新并提交,导致事务A多次读取同一数据时,结果不一致。
(3)幻读:在同一个事务中,执行两次相同的SQL,等到不同的结果集,(新增了部分记录或者缺失了部分记录)(与不可重复读操作对象不一样,此处,不是同一条记录)。
小结:不可重复读和幻读很容易混淆,不可重复读偏重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
7.MySQL InnoDB支持三种行锁定方式
Record Lock 单个行记录上的锁;
Gap Lock 锁定一个范围,但不包含记录本身;间隙锁是针对事务隔离级别为可重复读或以上级别,解决了幻读的问题。locking reads,UPDATE和DELETE时,除了对唯一索引的唯一搜索外都会获取gap锁或next-key锁。即锁住其扫描的范围。
Next-Key Lock Gap Lock + Record Lock,锁定一个范围,并且锁定记录本身。
8.(1)事务隔离级别为读提交时,写数据只会锁住相应的行。
(2)事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。
(3)事务隔离级别为串行化时,读写数据都会锁住整张表
(4)隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
9.间隙锁锁定的区域
根据检索条件向左寻找最靠近检索条件的记录值A,作为左区间,向右寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。
10.死锁
死锁是两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种互相等待的现象。
我们一般通过锁超时机制来解决死锁。参数为--innodb_lock_timeout. 而设置innodb_print_all_deadlocks 可决定是否将死锁信息打印到err_log中。
(If one session has a shared or exclusive lock on record R in an index, another session cannot insert a new index record in the gap immediately before R in the index order.)
MySQL 基础知识梳理学习(六)----锁的更多相关文章
- MySQL 基础知识梳理学习(五)----详解MySQL两次写的设计及实现
一 . 两次写提出的背景或要解决的问题 两次写(InnoDB Double Write)是Innodb中很独特的一个功能点.因为Innodb中的日志是逻辑的,所谓逻辑就是比如插入一条记录时,它可能会在 ...
- MySQL 基础知识梳理学习(三)----InnoDB日志相关的几个要点
1.InnoDB的特点 :(1)Fully ACID (InnoDB默认的Repeat Read隔离级别支持):(2)Row-level Locking(支持行锁):(3)Multi-version ...
- MySQL 基础知识梳理学习(七)----sync_binlog
一般在生产环境中,很少用MySQL单实例来支撑业务,大部分的MySQL应用都是采用搭建集群的方法.搭建MySQL集群,可以进行数据库层面的读写分离.负载均衡或数据备份.基于MySQL原生的Replic ...
- MySQL 基础知识梳理学习(四)----GTID
在日常运维中,GTID带来的最方便的作用就是搭建和维护主从复制.GTID的主从模式代替了MySQL早期版本中利用二进制日志文件的名称和日志位置的做法,使用GTID使操作和维护都变得更加简洁和可高. 1 ...
- MySQL 基础知识梳理学习(一)----系统数据库
information_schema 此数据库是MySQL数据库自带的,主要存储数据库的元数据,保存了关于MySQL服务器维护的所有其他数据库的信息,如数据库名.数据库表.表列的数据类型及访问权限等. ...
- MySQL 基础知识梳理学习(五)----半同步复制
1.半同步复制的特征 (1)从库会在连接到主库时告诉主库,它是不是配置了半同步. (2)如果半同步复制在主库端是开启了的,并且至少有一个半同步复制的从节点,那么此时主库的事务线程在提交时会被阻塞并等待 ...
- MySQL 基础知识梳理学习(二)----记录在页面层级的组织管理
1.InnoDB的数据存储结构 InnoDB中数据是通过段.簇.页面构成的. (1)段是表空间文件中的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引.表.回滚段的基本元素.创建一个索引( ...
- MySQL 基础知识梳理
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...
- [SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式
SQL 基础知识梳理(六)- 函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为“参数”,输出值称为“返回值”. 2. ...
随机推荐
- boostrap中模态框显示在阴影之下
boostrap中模态框显示在阴影之下 出现这种情况的原因我开始也搞了很久,问题出现在哪里呢? 有事问百度,在百度上查了一下资料,他们主要的解决办法:是 修改标签的z-index属性的值, 我试着改了 ...
- 原创分享!SharePoint母版页修改(实战)
分享人:广州华软 极简 一. 前言 SharePoint网站创建时,便自带一份母版页,可由开发人员重新自定义一份母版页,关于如何转换成母版页,由于之前已经讲述过,此篇便不再赘述了. 若自定义母版页,你 ...
- SharePoint布局页创建(实战)
分享人:广州华软 极简 一. 前言 SharePoint有母版页及布局页,母版页控制页面头部.底部,而布局页则控制页面中间内容区域.通过布局页,可以快速修改页面内容区域. SharePoint的页面布 ...
- JavaScript函数定义 ,参数调用
一.JavaScript函数函数: 函数就是一种封装,由事件驱动的或者当它被调用时执行的可重复使用的代码块.定义函数:function 函数名(){函数体;}数不会自动执行,需要被调用才可以执行函数名 ...
- github 进阶说明
目录 github 进阶说明 前言 三个目录树 重置 git reset 增加路径的reset 检出 checkout 带路径的checkout 仓库 数据对象 其他 资料 github 进阶说明 前 ...
- Windows 10-限制Windows更新上传带宽
Windows Update Delivery Optimization可帮助您更快,更可靠地获取Windows更新和Microsoft Store应用程序. Windows Update Deliv ...
- windows下nginx的安装及使用
安装过程比较简单 1.下载nginx http://nginx.org/en/download.html 下载稳定版本,以nginx/Windows-1.14.2为例,直接下载 nginx-1.14. ...
- MySQL学习(四)Join 等开发常用的操作 --- 2019年2月
1.查数据太多不会把内存用光 InnoDB 的数据是保存在主键索引上,然后索引树分割保存在数据页上,数据页存在内存中/磁盘.change buffer 就是先把修改操作记录,然后读数据的时候,内存没有 ...
- Python 闭包小记
闭包就是能够读取其他函数内部变量的函数.例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“.在本质上,闭包是将函数内部和函数外部连接起来 ...
- 网络协议 18 - CDN:家门口的小卖铺
[前五篇]系列文章传送门: 网络协议 13 - HTTPS 协议:加密路上无尽头 网络协议 14 - 流媒体协议:要说爱你不容易 网络协议 15 - P2P 协议:小种子大学问 网络协议 16 - D ...