MySQL的中的全局锁、表级锁、行锁
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事务中,行锁是在需要的时候才被加上,但并不是不需要了就会立刻释放,而是要等待当前事务结束后才会释放。
所以在如果事务中需要锁住多个行,把最可能造成并发的行尽量往后放。
举个:
一个购票的系统的买票业务大概是:
- 顾客A购票,A余额扣除票价
- 影院B账户余额增加电影票价
- 记录交易日志
这条业务下,并发的点在于影院B增加收入,如果每个客户按照1、2、3的业务顺序去购票,那么并发的点2持有锁的时间会很长;如果修改为3、1、2处理完并发的点之后,就会释放行级锁,减少了事物之间的锁的等待时间。
死锁和死锁检测
不同线程之间互相持有对方的锁,A等B释放锁,B等A释放锁,那么就会造成死锁
处理死锁的策略:
一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数 innodb_lock_wait_timeout 来设置
发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑,
这里需要注意:
(1)访问的行上有行锁才会去做死锁检测
(2)并不是每次死锁检测都都要扫所有事务。比如某个时刻,事务等待状态是这样的:
B在等A,D在等C,现在来了一个E,发现E需要等D,那么E就判断跟D、C是否会形成死锁,这个检测不用管B和A
MySQL的中的全局锁、表级锁、行锁的更多相关文章
- [数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁
注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的 ...
- 【数据库】数据库的锁机制,MySQL中的行级锁,表级锁,页级锁
转载:http://www.hollischuang.com/archives/914 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数 ...
- MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- 【转】MySQL中的行级锁,表级锁,页级锁
在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引 ...
- 转 MySQL中的行级锁,表级锁,页级锁
对mysql乐观锁.悲观锁.共享锁.排它锁.行锁.表锁概念的理解 转载. https://blog.csdn.net/puhaiyang/article/details/72284702 实验环境 ...
- MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...
- MySQL行级锁,表级锁,页级锁详解
页级:引擎 BDB. 表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行 行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它进程无法对该表进行写 ...
- Java并发 行级锁/字段锁/表级锁 乐观锁/悲观锁 共享锁/排他锁 死锁
原文地址:https://my.oschina.net/oosc/blog/1620279 前言 锁是防止在两个事务操作同一个数据源(表或行)时交互破坏数据的一种机制. 数据库采用封锁技术保证并发操作 ...
- 通过JSP网页连接MySQL数据库,从MySQL数据库中读出一张表并显示在JSP网页中
1.安装所需软件 ①安装java和tomcat,建立JSP网页最基础的软件②安装MySQL数据库(下载地址:https://www.mysql.com/)③安装Navicat Premium来查看数据 ...
随机推荐
- for循环使用体会
最近在看源码的时候看到了以下代码: Class[] var2 = componentClasses; int var3 = componentClasses.length; for(int var4 ...
- (六)HTTP和HTTPS(转)
一.HTTP和HTTPS的基本概念 HTTP:用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少. HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的 ...
- 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 ...
- 解Bug之路-NAT引发的性能瓶颈
解Bug之路-NAT引发的性能瓶颈 笔者最近解决了一个非常曲折的问题,从抓包开始一路排查到不同内核版本间的细微差异,最后才完美解释了所有的现象.在这里将整个过程写成博文记录下来,希望能够对读者有所帮助 ...
- stm32与地磁传感器HMC5883L
1.简介 霍尼韦尔 HMC5883L 是一种表面贴装的高集成模块,并带有数字接口的弱磁传感器芯片,应用于低成本罗盘和磁场检测领域.HMC5883L 包括最先进的高分辨率 HMC118X 系列磁阻传感器 ...
- javaweb项目中jsp的from表单提交action内容与web.xml的servlet-mapping对应
login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...
- django环境安装操作整理!
1. Django 下载地址:https://www.djangoproject.com/download/ 注意:目前 Django 1.6.x 以上版本已经完全兼容 Python 3.x. 2.安 ...
- 关于mybatis拦截器,对结果集进行拦截
因业务需要,需将结果集序列化为json返回,于是,网上找了好久资料,都是关于拦截参数的处理,拦截Sql语法构建的处理,就是很少关于对拦截结果集的处理,于是自己简单的写了一个对结果集的处理, 记录下. ...
- Spider--补充--jsonpath的使用
# 知识点参见:https://blog.csdn.net/muzico425/article/details/102763176 # 示例:爬取示例网站的首页的评论: # 解析得到的字符串r.tex ...
- JAVA中常见的阻塞队列详解
在之前的线程池的介绍中我们看到了很多阻塞队列,这篇文章我们主要来说说阻塞队列的事. 阻塞队列也就是 BlockingQueue ,这个类是一个接 口,同时继承了 Queue 接口,这两个接口都是在JD ...