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来查看数据 ...
随机推荐
- 栈的C++实现
数据结构c++实现系列第一篇. 话不多说,直接上代码. sichstack.h (头文件) 1 #pragma once 2 #include<string> 3 4 namespace ...
- 企业微信公众号告警Python脚本
#!/usr/bin/env python # -*- coding: utf-8 -*- import time import requests import json import os impo ...
- Odoo环境搭建之问题readme
环境及工具 Windows,PyCharm Community Edition,postgresql-13.0-1 启动odoo环境 python odoo-bin 如果你只是还是空壳,启动odoo之 ...
- C# 2 新增语法特性
C# 2.0 ,.NET Framework 2.0,.NET Framework 3.0,Visual Studio 2005 C#2主要添加了泛型.匿名方法,分部类型(类.结构.接口),可空类型, ...
- unix进程间通信方式(IPC)
unix进程间通信方式(IPC) 管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. 命名管道(named pipe):命名管道克服了管道没有 ...
- 国内申请苹果美区ID
首先声明,纯粹是自己为了玩游戏而找到的方法..... 不用翻墙,在国内,就可以申请非国区的apple ID. 1.你自己申请一个自己的国区的apple ID,地址:https://appleid.ap ...
- 内网安装python第三方包
内网快速安装python第三方包 内网安装包是一个很麻烦的问题,很多时候,内网的源会出现问题,导致无法安装. 这里给出一种快速在内网中安装第三方包,无需使用内网的源. 外网操作 1.根据开发环境下的所 ...
- Spider--补充--jsonpath的使用
# 知识点参见:https://blog.csdn.net/muzico425/article/details/102763176 # 示例:爬取示例网站的首页的评论: # 解析得到的字符串r.tex ...
- martini-能量最小化参数(mdp文件)
1 ; 2 ; STANDARD MD INPUT OPTIONS FOR MARTINI 2.x 3 ; Updated 02 feb 2013 by DdJ 4 ; 5 ; for use wit ...
- RPC协议实践入门
RPC 是什么 RPC(Remote Procedure Call) 是一个计算机通信协议.该协议允许运行与一台计算机的程序调用另一个地址空间的程序,是一个通过发送请求-接受回应进行信息交互的系统. ...