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 全局锁、表锁以及行锁的更多相关文章

  1. MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)

    原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...

  2. 极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间

    极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间 笔记体会: 方案一,事务相 ...

  3. MySQL锁(三)行锁:幻读是什么?如何解决幻读?

    概述 前面两篇文章介绍了MySQL的全局锁和表级锁,今天就介绍一下MySQL的行锁. MySQL的行锁是各个引擎内部实现的,不是所有的引擎支持行锁,例如MyISAM就不支持行锁. 不支持行锁就意味着在 ...

  4. MySQL数据库 InnoDB引擎 事务及行锁总结

    一.事务 1.事务的四大特性 (1)原子性:事务开始后所有的操作要么一起成功,要么一起失败,整个事务是一个不可分割的整体. (2)一致性:是物开始前到结束后,数据库的完整性约束没有被破坏. (3)隔离 ...

  5. MySQL锁:03.InnoDB行锁

    目录 InnoDB 行锁 锁排查可以用的视图和数据字典 InnoDB 行锁兼容性 InnoDB行锁之共享锁 共享锁: 查看InnoDB锁 InnoDB行锁实现机制 对普通索引上锁 InnoDB隐式.显 ...

  6. SQL Server 锁表、查询被锁表、解锁相关语句

    SQL Server 锁表.查询被锁表.解锁相关语句,供参考. --锁表(其它事务不能读.更新.删除) BEGIN TRAN SELECT * FROM <表名> WITH(TABLOCK ...

  7. sql server锁表、查询被锁表、解锁被锁表的相关语句

    MSSQL(SQL Server)在我的印象中很容易锁表,大致原因就是你在一个窗口中执行的DML语句没有提交,然后又打开了一个窗口对相同的表进行CRUD操作,这样就会导致锁表.锁表是一种保持数据一致性 ...

  8. Oracle锁表与解锁 对象锁与解锁

    阅读目录 锁表与解锁 查看锁表进程SQL语句 解锁 对象锁与解锁 回到顶部 锁表与解锁 查看锁表进程SQL语句 select * from v$session t1, v$locked_object ...

  9. mysql中InnoDB存储引擎的行锁和表锁

    Mysql的InnoDB存储引擎支持事务,默认是行锁.因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错. ...

  10. Mysql InnoDB行锁不使用索引锁表的时候会锁整张表

    原文:http://www.thinkphp.cn/topic/41577.html 如果使用针对InnoDB的表使用行锁,被锁定字段不是主键,也没有针对它建立索引的话.行锁锁定的也是整张表.锁整张表 ...

随机推荐

  1. RedHat6.5安装单机flume1.6

    版本号: RedHat6.5   JDK1.8   apache-flume-1.6.0 1.apache-flume-1.6.0-bin.tar.gz 下载 官网下载地址:http://archiv ...

  2. Oracle存储过程和自定义函数笔记

    学习地址:https://www.imooc.com/learn/370 存储过程和存储函数定义:指存储在数据库中供所有用户程序调用的子程序叫做存储过程 .存储函数. 相同点:完成特定功能的程序.区别 ...

  3. 三重DEC加密在java中的实现

    代码可以直接拷走使用,一些约定例如向量可以自行变动 引言      如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在android.ios.java平台 ...

  4. 第一个NIOS II工程using Qsys-------Let Qsys Say Hello

    1.新建工程 2.添加原理图文件 注:似乎Nios II工程都需要涉及到原理图编程. 3.进入Qsys进行内核设计 注:启动Qsys后,系统已经为内核默认添加了一个组件clk_0. 4.设置时钟名字和 ...

  5. sublime text2+Ctags+Cscope替代Source Insight

    说明:以Windows系统下查看C++代码为例.因为Source Insight(以下简称SI)是收费软件,且界面丑陋,所以考虑其替代方案,发现Sublime Text3(以下简称ST3) + Cta ...

  6. HTTP协议之chunk介绍

    http chunked 当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-Length消息首部字段告诉客户端需要接收多少数据.但是如果是动态页面 ...

  7. 通过U盘启动vmware虚拟机

    不能通过虚拟机的USB功能,而是通过硬盘映射功能实现,操作方法如下图. 1.添加硬盘,注意接口类型与启动系统的支持(XPPE不支持scsi,但10pe支持) 2.硬盘类型 3.选择U盘映射 4.按F2 ...

  8. 数据仓库3NF基础理论和实例

    一.引言 最近在梳理大数据模式下的数据仓库数据模型,花了点时间,系统的回顾一下传统数据仓库数据模型设计的理论,作为笔记分享给大家,很多资料来自互联网和读过的数据仓库理论和实践相关的熟悉,无剽窃之心,共 ...

  9. 关于“最小的K个数”问题

    从一堆无序的数中(共n个数)找到最小的K个数,这也算是一道比较经典的题目了,关于这道题目的解法,一般有几种: 方法1:先对所有的数据进行排序,然后直接找出前K个数来,即最小的K个数.时间复杂度为O(N ...

  10. Eclipse安装Markdown插件

    Markdown Editor 安装Markdown插件可以实现 .md 和 .txt 文件的 Markdown 语法高亮,并提供 HTML 预览. 因为之前没有安装过别的插件,eclipse上安装插 ...