MySQL的中的全局锁、表级锁、行锁

学习极客时间-林晓彬老师-MySQL实战45讲 学习整理

全局锁

对整个数据库实例加锁。通过使用Flush tables with read lock (FTWRL)方法,让整个数据库处于只读的状态,此后的数据库的更新语句(增删改)、数据定义语句(建表、修改表结构)和更新类事务的提交语句会被阻塞

锁定整个数据库,那么全局锁的一个明显的使用场景就是做全库逻辑备份;还有另外一个方式使用 set global readonly=true 让全库进入只读的状态,这两种方式有个最大的区别是:

异常处理上,如果客户端发生异常断开,MySQL会自动释放全局锁,让整个库回到正常的状态;将整个库设置为readonly之后,异常断开后,数据库还是会一直保持readonly状态,导致数据库长时间处于不可写状态。

表级锁

MySQL有两种表级锁:表锁和元数据锁(meta data lock (MDL))

表锁语法lock tables ...read/write,解锁unlock talbes。在客户端断开的时候会自动释放。表锁除了会限制别的线程读写外,也限定了本线程接下来的操作对象,例如:线程A执行lock tables t1 read,t2 write,其他线程写t1读t2写都会被阻塞,在unlock tables之前,A线程也只能读t1,写t2

元数据锁在访问一个表的时候回自动加上,保证在访问数据的时候,表的结构不能修改

行锁

MySQL的行锁是在各个存储引擎中自己实现,InnoDB中就支持行锁,MyISAM引擎就不支持行锁

行锁就是锁住表中一行记录的锁,当A在对这行数据进行处理,B也想处理这条数据,就需要等到A处理完毕之后,B才能继续

两阶段锁协议

在InnoDB事务中,行锁是在需要的时候才被加上,但并不是不需要了就会立刻释放,而是要等待当前事务结束后才会释放。

所以在如果事务中需要锁住多个行,把最可能造成并发的行尽量往后放。

举个:

一个购票的系统的买票业务大概是:

  1. 顾客A购票,A余额扣除票价
  2. 影院B账户余额增加电影票价
  3. 记录交易日志

这条业务下,并发的点在于影院B增加收入,如果每个客户按照1、2、3的业务顺序去购票,那么并发的点2持有锁的时间会很长;如果修改为3、1、2处理完并发的点之后,就会释放行级锁,减少了事物之间的锁的等待时间。

死锁和死锁检测

不同线程之间互相持有对方的锁,A等B释放锁,B等A释放锁,那么就会造成死锁

处理死锁的策略:

  1. 一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置

  2. 发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑,

    这里需要注意:

    (1)访问的行上有行锁才会去做死锁检测

    (2)并不是每次死锁检测都都要扫所有事务。比如某个时刻,事务等待状态是这样的:

    B在等A,D在等C,现在来了一个E,发现E需要等D,那么E就判断跟D、C是否会形成死锁,这个检测不用管B和A

MySQL的中的全局锁、表级锁、行锁的更多相关文章

  1. [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

    注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...

  2. 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁

    转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...

  3. MySQL中的行级锁,表级锁,页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

  4. 【转】MySQL中的行级锁,表级锁,页级锁

    在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...

  5. 转 MySQL中的行级锁,表级锁,页级锁

      对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁概念的理解 转载. https://blog.csdn.net/puhaiyang/article/details/72284702 实验环境 ...

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

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

  7. MySQL行级锁,表级锁,页级锁详解

    页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写 ...

  8. Java并发 行级锁/字段锁/表级锁 乐观锁/悲观锁 共享锁/排他锁 死锁

    原文地址:https://my.oschina.net/oosc/blog/1620279 前言 锁是防止在两个事务操作同一个数据源(表或行)时交互破坏数据的一种机制. 数据库采用封锁技术保证并发操作 ...

  9. 通过JSP网页连接MySQL数据库,从MySQL数据库中读出一张表并显示在JSP网页中

    1.安装所需软件 ①安装java和tomcat,建立JSP网页最基础的软件②安装MySQL数据库(下载地址:https://www.mysql.com/)③安装Navicat Premium来查看数据 ...

随机推荐

  1. for循环使用体会

    最近在看源码的时候看到了以下代码: Class[] var2 = componentClasses; int var3 = componentClasses.length; for(int var4 ...

  2. (六)HTTP和HTTPS(转)

    一.HTTP和HTTPS的基本概念 HTTP:用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少. HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的 ...

  3. php之4个坐标点判断是否为矩形和正方形

    代码 <?php $a=[0,0]; $b=[0,1]; $c=[1,1]; $d=[1,0]; $ar=array($a,$b,$c,$d); $a1=[]; // 0 1 2 3 forea ...

  4. 解Bug之路-NAT引发的性能瓶颈

    解Bug之路-NAT引发的性能瓶颈 笔者最近解决了一个非常曲折的问题,从抓包开始一路排查到不同内核版本间的细微差异,最后才完美解释了所有的现象.在这里将整个过程写成博文记录下来,希望能够对读者有所帮助 ...

  5. stm32与地磁传感器HMC5883L

    1.简介 霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域.HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器 ...

  6. javaweb项目中jsp的from表单提交action内容与web.xml的servlet-mapping对应

    login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...

  7. django环境安装操作整理!

    1. Django 下载地址:https://www.djangoproject.com/download/ 注意:目前 Django 1.6.x 以上版本已经完全兼容 Python 3.x. 2.安 ...

  8. 关于mybatis拦截器,对结果集进行拦截

    因业务需要,需将结果集序列化为json返回,于是,网上找了好久资料,都是关于拦截参数的处理,拦截Sql语法构建的处理,就是很少关于对拦截结果集的处理,于是自己简单的写了一个对结果集的处理, 记录下. ...

  9. Spider--补充--jsonpath的使用

    # 知识点参见:https://blog.csdn.net/muzico425/article/details/102763176 # 示例:爬取示例网站的首页的评论: # 解析得到的字符串r.tex ...

  10. JAVA中常见的阻塞队列详解

    在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...