MySQL 全局锁、表锁以及行锁
1. 系统版本
MySQL 5.7.25 ubuntu 16.04
2. 全局锁
全局锁即对整个数据库实例加锁,使得整个库处于只读状态,会阻塞DML和DDL语句。
使用如下命令(简称FTWRL)可为数据库加全局锁:
flush tables with read lock;
释放全局锁命令如下:
unlock tables;
此外,在客户端异常断开后,全局锁会自动释放。
3. 表级锁
3.1 表锁
表锁用于用于为单个表加锁,表锁的类型分为读锁和写锁。
3.1.1 加表锁的命令
lock tables tb_name read/write;
3.1.2 释放锁的命令
unlock tables;
3.1.3表锁对线程的阻塞作用
当前线程(假设为线程A)对表加表锁后:
(1)不能对没有加锁的表执行DML和DDL语句;
(2)只能读加了read表锁的表;
(3)能读写加了write表锁的表。
在线程A没有释放表所前,对于后续的线程B:
(1)无法读写由其他线程(此处为线程A)加了write表锁的表;
(2)可读但无法写其他线程(此处为线程A)加了read表锁的表;
(3)可读写没有加表锁的表。
3.2 元数据锁
元数据锁(meta data lock 简称MDL) 用于确保事务执行过程中表结构的稳定。MDL在MySQL 5.5中加入。MDL会在访问一个表时自动被加上。MDL分为写锁和读锁。
3.2.1 MDL读锁
对一个表执行DML语句时,会加上MDL读锁。MDL读锁之间不互斥。
3.2.2 MDL写锁
对一个表执行DDL语句时,会加上MDL写锁。MDL写锁和MDL读锁之间、MDL写锁之间互斥。例如,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完方可执行。
4. 行锁
故名思议,行锁即对行数据行进行加锁。行锁在引擎层由n各个数据库引进行擎独自实现。因此,如MyISAM没有行锁,InnoDB则有行锁。
5 两阶段锁协议及死锁
两阶段锁协议能提高数据库的事务处理效率。结合MVCC(多版本并发控制),能提高数据库的并发性能。但两阶段协议也形成了造成死锁的可能性,也为数据库带来为解决死锁问题而产生的额外性能开销甚至是数据库崩溃。
以下说明基于MySQL的InnoDB引擎。
5.1 并发控制
并发控制主要有两种方式:锁和多版本并发控制(MVCC)。
5.1.1 锁
为事务所需涉及的表加上锁(为只需获数据的共享锁,为增删改数据的表加上排他锁),确保事务串行化,确保数据的正确性。但这影响了数据库的并发性能。
5.1.2 MVCC(多版本并发控制)
MVCC为数据库的并发性能提供了高效的解决方案。
InnoDB的MVCC的实现方式为为每一个事务赋予一个自增且唯一的transaction ID。同时为涉及到事务增删改的数据行形成一个新版本,同时赋这个新版本一个row trx_id,row trx_id的值和对应事务的transaction ID值相同。
在事务开始执行的时候,数据库会对整个库创建一个视图,对于在视图建时未提交的行数版本,该视图不可见。
注意,对于已经创建但未提交的数据版本,视会通过row trx_id以及undo log回滚数据行之前已提交的版本。
5.2两阶段锁协议(Two-Phase Locking,2PL)
两阶段锁协议指的是事务的执行分为两个阶段,分别为扩展阶段(此阶段只能创建锁而不能释放锁,即需要加锁的时候才加锁)以及收阶段只能释而不加锁)。
两阶段协保证了多个事务在并发的情况下等同于串行的执行,即事务的隔离性。
5.2 死锁形成原因
当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态,称为死锁。
5.3 死锁解决机制
(1)超时
直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout 来设置。
(2)死锁主动检查
发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为on,表示开启死锁检测。
注意,死锁检查会消耗额外资源,若并发的线过多,则有可能由死锁检测而消耗过多资源而导数据库崩溃。
MySQL 全局锁、表锁以及行锁的更多相关文章
- MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...
- 极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间
极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间 笔记体会: 方案一,事务相 ...
- MySQL锁(三)行锁:幻读是什么?如何解决幻读?
概述 前面两篇文章介绍了MySQL的全局锁和表级锁,今天就介绍一下MySQL的行锁. MySQL的行锁是各个引擎内部实现的,不是所有的引擎支持行锁,例如MyISAM就不支持行锁. 不支持行锁就意味着在 ...
- MySQL数据库 InnoDB引擎 事务及行锁总结
一.事务 1.事务的四大特性 (1)原子性:事务开始后所有的操作要么一起成功,要么一起失败,整个事务是一个不可分割的整体. (2)一致性:是物开始前到结束后,数据库的完整性约束没有被破坏. (3)隔离 ...
- MySQL锁:03.InnoDB行锁
目录 InnoDB 行锁 锁排查可以用的视图和数据字典 InnoDB 行锁兼容性 InnoDB行锁之共享锁 共享锁: 查看InnoDB锁 InnoDB行锁实现机制 对普通索引上锁 InnoDB隐式.显 ...
- SQL Server 锁表、查询被锁表、解锁相关语句
SQL Server 锁表.查询被锁表.解锁相关语句,供参考. --锁表(其它事务不能读.更新.删除) BEGIN TRAN SELECT * FROM <表名> WITH(TABLOCK ...
- sql server锁表、查询被锁表、解锁被锁表的相关语句
MSSQL(SQL Server)在我的印象中很容易锁表,大致原因就是你在一个窗口中执行的DML语句没有提交,然后又打开了一个窗口对相同的表进行CRUD操作,这样就会导致锁表.锁表是一种保持数据一致性 ...
- Oracle锁表与解锁 对象锁与解锁
阅读目录 锁表与解锁 查看锁表进程SQL语句 解锁 对象锁与解锁 回到顶部 锁表与解锁 查看锁表进程SQL语句 select * from v$session t1, v$locked_object ...
- mysql中InnoDB存储引擎的行锁和表锁
Mysql的InnoDB存储引擎支持事务,默认是行锁.因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错. ...
- Mysql InnoDB行锁不使用索引锁表的时候会锁整张表
原文:http://www.thinkphp.cn/topic/41577.html 如果使用针对InnoDB的表使用行锁,被锁定字段不是主键,也没有针对它建立索引的话.行锁锁定的也是整张表.锁整张表 ...
随机推荐
- SqlServer :利用快捷键快速查看 字段说明查询及表结构 (小技巧)
1.自定义4个常用的存储过程: sp_select :select * from sp_helpremark :查表的列,列的类型,备注(这里只查询有备注的列) sp_columns1 : 查表所有的 ...
- 关于信号的延迟---verilog
关于信号的延迟---verilog `timescale 1ns / 1ps ///////////////////////////////////////////////////////////// ...
- Maven Docker部署
镜像构建方式 docker-maven-plugin插件构建docker镜像有两种方式: 1. 指定参数,由docker-maven-plugin插件根据这些参数来制作镜像: 2. 指定Dockerf ...
- sp_who, sp_who2和sp_who3
sp_who可以返回如下信息: (可选参数LoginName, 或active代表活动会话数)Spid (系统进程ID)status (进程状态)loginame (用户登 ...
- elixir环境配置
mac下 brew install elixir debian下版本可能太低,需要kiex 安装 curl -sSL https://raw.githubusercontent.com/taylor/ ...
- php中的this,self,parent
this就是指向当前对象实例的指针,不指向任何其他对象或类 如$this->fun1(); self:指向类本身,也就是self是不指向任何已经实例化的对象 ,self使用来指向类中的静态属性或 ...
- gulp学习总结
一.gulp使用-博客推荐: http://www.sheyilin.com/2016/02/gulp_introduce/ 二.gulp的作用 gulp是一个前端构建工具,它是一个工具框架,可以通过 ...
- bzoj2856: [ceoi2012]Printed Circuit Board
Description 给出一个N个顶点的简单多边形,对于每个顶点,假如它和原点连成的线段只在这个顶点处和多边形相交,就称为满足要求的顶点.你的任务是输出所有满足要求的顶点编号. Input 第一行一 ...
- js面向对象1
1.在空白的Object上加属性和方法: <script type="text/javascript"> function createPerson(name, qq) ...
- js实现星空效果
本次主要是来实现上面的星空效果:在黑色的背景下面,有大小不一的星星在闪烁,当鼠标悬浮时,星星放大并旋转. 首先,我们需要一个大的夜空容器和放星星的容器: <!DOCTYPE html> & ...