MySQL-全句锁、表锁和元数据锁
全局锁
全局锁是锁住整个数据库实例,只能读,任何关于更新操作的语句都会阻塞。
全局锁的适用场景
针对数据库做全库的逻辑备份操作时,需要使用全局锁。
全局锁的影响:
- 如果在主库上做全局锁操作,业务基本停摆
- 如果在从库上做全局锁操作,备份期间从库不能更新主库同步过来的binlog,可能导致主从不一致
如果不加锁,备份完成后可能得到不一致的状态,不安全,所以一定要加锁。
如何加全局锁?
- 非innodb引擎,需要使用Flush table with read lock命令
- innodb引擎,可以使用mysqldump命令实现,加入一个参数 --single-transaction,在备份前开启一个事务,保证视图的一致性。
- (不建议使用)set global readonly=true; 原因如下:
- 修改参数的影响面大。有些系统中,这个参数用来作其他用途,比如判断是主库还是从库,因此修改这个参数的影响面比较大。
- 异常的处理机制不友好。FTWRL如果客户端连接异常断开,mysql会自动释放全局锁;如果设置参数,出现异常后,数据库仍旧是readonly为true的状态,风险较高。
表锁
表锁是锁住整张表,通过不同的表锁设置,控制并发访问。某些引擎不支持行锁,需要通过表锁来控制并发。支持行锁的引擎,就不建议使用表锁了。
如何加表锁?
lock tables t1 read,t2 write;
这个语句有两个含义:
- 对其他线程来说,t1表,可以读,不可以写;t2表,读写都不可以
- 对本线程来说,t1表只能读,t2表只能读写
元数据锁(Metadata Lock 简称MDL)
元数据锁主要是面向DML和DDL之间的并发控制,如果对一张表做DML增删改查操作的同时,有一个线程在做DDL操作,不加控制的话,就会出现错误和异常。元数据锁不需要我们显式的加,系统默认会加。
元数据锁的原理
当做DML操作时,会申请一个MDL读锁
当做DDL操作时,会申请一个MDL写锁
读锁之间不互斥,读写和写写之间都互斥。
实验验证
mysql实验环境:5.7
mysql客户端:mysql命令行工具
一共开启3个session,SessionA,SessionB,SessionC。
第一次实验:
时间线和执行命令如下
A:begin; select * from t;-------------------------------------------------commit;------------
----------------------------B: alter table t add f1 int;-----------------------------------------
--------------------------------------------------------C: select * from t;----------------------
实验结果:
在执行commit前,B和C都会阻塞住。
执行commit后,看起来B先返回数据,C后返回数据。
第二次实验:
时间线和执行命令如下
A:begin; select * from t;---------------------------------------------------------commit;----
----------------------------B: alter table t add f2 int;-----------------------------------------------
----------------------------------------------------------C: begin; select * from t;------------commit-
实验结果:
在执行commit前,B和C都会阻塞住。
执行commit后,B正常返回,C依旧阻塞住。
在B执行commit后,C正常返回。
元数据实验结果分析
现象1
当开启一个事务时,在事务中做DML操作时,就会拿到读锁,在事务未提交之前,如果有一个DDL操作,那么会阻塞,同时还会阻塞后面的所有读和写操作。
原因
获取锁有一个队列,写操作先进入队列中,并且写操作的优先级很高,如果写操作被阻塞了,后面的读和写都会被阻塞。
现象2
在读和写都被阻塞后,提交事务,看起来反倒是读先拿到锁,返回数据。
原因
mysql5.6以后,加入了onlineDDL的操作,一共有5个步骤。
- 申请MDL写锁
- 申请到后降级为读锁
- 真正的DDL操作
- 申请MDL写锁
- 释放锁
在SessionA的事务提交后,确实是SessionB写操作先拿到写锁,然后在第二步降级为读锁后,后面的SessionC的读操作就可以正常获取读锁,执行后返回。
- 如果SessionC释放了读锁,SessionB的写操作在第四步的时候就可以成功
- 如果SessionC没释放读锁,SessionB的写操作在第四步就会阻塞住
所以SessionC如果是自动提交,执行完毕后自动释放锁,SessionB也可以返回;SessionC如果使用begin手动开启事务,执行完成后,commit前都不会释放锁,SessionB也就会一直阻塞,直到SessionC执行了commit操作SessionB才会返回。
MySQL-全句锁、表锁和元数据锁的更多相关文章
- SQL Server 锁表、查询被锁表、解锁相关语句
SQL Server 锁表.查询被锁表.解锁相关语句,供参考. --锁表(其它事务不能读.更新.删除) BEGIN TRAN SELECT * FROM <表名> WITH(TABLOCK ...
- sql server锁表、查询被锁表、解锁被锁表的相关语句
MSSQL(SQL Server)在我的印象中很容易锁表,大致原因就是你在一个窗口中执行的DML语句没有提交,然后又打开了一个窗口对相同的表进行CRUD操作,这样就会导致锁表.锁表是一种保持数据一致性 ...
- Oracle锁表与解锁 对象锁与解锁
阅读目录 锁表与解锁 查看锁表进程SQL语句 解锁 对象锁与解锁 回到顶部 锁表与解锁 查看锁表进程SQL语句 select * from v$session t1, v$locked_object ...
- SQL Server 手工 锁表、查询被锁表、解锁相关语句
SQL Server 手工 锁表.查询被锁表.解锁相关语句 --锁表(其它事务不能读.更新.删除) BEGIN TRAN SELECT * FROM <表名> WITH(TABLOCKX) ...
- oracle 查看锁表情况并处理锁表
/* *locked *query locked object and analyse reason,kill it * */ select 'alter system kill session '' ...
- oracle查看锁表进程,杀掉锁表进程[转载]
select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, ...
- Oracle 查看锁表进程_杀掉锁表进程 [转]
查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo ...
- oracle查看锁表进程,杀掉锁表进程
查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao ...
- Mysql InnoDB行锁不使用索引锁表的时候会锁整张表
原文:http://www.thinkphp.cn/topic/41577.html 如果使用针对InnoDB的表使用行锁,被锁定字段不是主键,也没有针对它建立索引的话.行锁锁定的也是整张表.锁整张表 ...
- 【MySQL】MySQL 常用语法之锁表与解锁表
mysql 锁表语句: Lock锁整张表: 写锁定: LOCK TABLES products WRITE: 写锁,锁定之后,只有当前线程可以进行读操作和写操作,其他线程读操作和写操作均被堵塞.... ...
随机推荐
- KES的执行计划分析与索引优化
今天我们继续探讨国产数据库KES的相关内容,本次的讨论重点将放在SQL优化的细节上.作为Java开发人员,我们通常并不需要深入了解数据库的底层实现细节,而是更多地关注如何提升应用性能与数据库的交互效率 ...
- BotSharp 4.0 Sidecar:迈向更大规模化的AI Agent平台框架
BotSharp 是一个功能强大的开源项目,由 SciSharp[1] 社区开发和维护,旨在实现.NET技术栈下高度可定制的多智能体解决方案.为开发高效的对话式 AI 系统提供了极大的灵活性.通过其模 ...
- 深入剖析数据删除操作:DELETE 语句的使用与管理实践
title: 深入剖析数据删除操作:DELETE 语句的使用与管理实践 date: 2025/1/8 updated: 2025/1/8 author: cmdragon excerpt: 数据删除( ...
- 前端面试100-copy
1.一些开放性题目 1.自我介绍:除了基本个人信息以外,面试官更想听的是你与众不同的地方和你的优势. 2.项目介绍 3.如何看待前端开发? 4.平时是如何学习前端开发的? 5.未来三到五年的规划是怎样 ...
- 项目PMP之三项目经理
一.项目经理定义:由执行组织委派,领导实现目标 二.影响范围: 项目本身:相关方沟通.完善各职能结构:通过人际关系和沟通技能及积极态度充当沟通者,以平衡项目相关方并达成共识 组织:组织结构中进行积极沟 ...
- 同态加密技术及其在FL/MPC中的应用-洪澄
转载:链接 Pailler是具有一次乘法同态的. Pailler 我好像一直叫的都是 "拍利尔" . 关于定理的证明,参考:Pailler 同态性 安全性 语义安全 DCR问题 简 ...
- Calendar日历类(抽象类)的使用
4. java.util.Calendar( 日历)类 类 Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能. 获取Calendar实例的方法 使用Calendar.get ...
- 去除小程序scroll-view产生的横向滚动条
<template> <view class="page-demo"> <scroll-view class="scrool-more&qu ...
- AI编程:cursor使用教程
这是小卷对AI编程工具学习的第1篇文章,今天以cursor为例,通过给提示词,让不懂编程的小白也能自己用代码实现需求 1.什么是AI编程工具? 可以分为两类: 狭义的AI编程工具 面向程序员的,主要用 ...
- C++学习:CRTP 模式是什么
CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)是 C++ 中的一种设计模式. 基本概念 CRTP 是指一个类(通常是基类)以其派生类作为模板参数 ...