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. 4G DTU模块的工作原理

    DTU是无线数据传输模块,4G DTU又被称4G模块,是4G网络进行远距离传输的设备,即串口服务器的无线版,其功能与串口服务器类似.         4G DTU是一种物联网无线数据终端,利用公用运营 ...

  3. python机器学习TensorFlow框架

    TensorFlow框架 关注公众号"轻松学编程"了解更多. 一.简介 ​ TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运 ...

  4. Django之MTV实战(2)

    目录 1. 回顾知识 1.1 新增工程 1.2 创建新的APP 1.3 注册APP 1.4 编写URL和VIEW 1.5 验证结果如下: 2. 基本概念 2.1 专业术语 2.2 MTV之视图 2.2 ...

  5. [论文阅读] RNN 在阿里DIEN中的应用

    [论文阅读] RNN 在阿里DIEN中的应用 0x00 摘要 本文基于阿里推荐DIEN代码,梳理了下RNN一些概念,以及TensorFlow中的部分源码.本博客旨在帮助小伙伴们详细了解每一步骤以及为什 ...

  6. KOA2 笔记

    KOA2 基于ES7开发,完全使用Promise并配合async来实现异步的node框架 核心是对node的HTT模块P进行了封装,用多个async函数组成处理链,来不断地接收HTTP请求(ctx对象 ...

  7. JMeter100个线程竟然只模拟出1个并发

    线程组,是说到 JMeter 会第一时间想到的东西,也是我认为 JMeter 最难理解的知识点.因为项目让你做个压测,首先就是要考虑并发,用 JMeter 就是用多线程 来模拟多并发.但在看到线程组编 ...

  8. Java项目——嗖嗖移动业务大厅

    嗖嗖移动业务大厅包类(如下图): SosoMgr: 1 package cn.biz; 2 3 import java.util.Scanner; 4 5 import cn.common.Commo ...

  9. epoll oneshot

    /* Epoll private bits inside the event mask */#define EP_PRIVATE_BITS (EPOLLWAKEUP | EPOLLONESHOT | ...

  10. python之路《八》装饰器

    装饰器是个好东西啊 那么装饰器是个什么样的东西呢,他又能做些什么呢? 1.为什么装饰器 当我们一个程序已经构建完成,并且已经发布出去了,但是现在需要增加一个活动,例如淘宝给你发送一个今日优惠,或者开启 ...