当前位置:网站首页>MySQL 45讲 | 06 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
MySQL 45讲 | 06 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
2022-07-25 14:29:00 【蓝布棉】
06 | 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
- 数据库锁设计的初衷是处理并发问题。
- 根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。
全局锁
全局锁就是对整个数据库实例加锁。
加全局读锁的方法,命令是
Flush tables with read lock (FTWRL)。全局锁让整个库出入只读状态, 其他线程的:数据更新语句(数据的增删改)、数据定义语句(包括 建表、修改表结构等)和更新类事务的提交语句会被阻塞。
全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都select出来存成文本。
不加锁的话,备份系统备份的得到的库不是一个逻辑时间点,这个视图是逻辑不一致的。
官方自带的逻辑备份工具是
mysqldump。
当mysqldump使用参数
–single-transaction的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于MVCC的支持,这个过程中数据是 可以正常更新的。 ( single-transaction方法只适用于所有的表使用事务引擎的库)
问题: 既然要全库只读,为什么不使用set global readonly=true的方式呢?
确实 readonly方式也可以让全库进入只读状态,但我还是会建议你用FTWRL方式 。
(1)在有些系统中,readonly的值会被用来做其他逻辑,比如用来判断一个库是主库还是备 库。因此,修改global变量的方式影响面更大,不建议使用。
(2)在异常处理机制上有差异。如果执行FTWRL命令之后由于客户端发生异常断开,那么 MySQL会自动释放这个全局锁,整个库回到可以正常更新的状态。而将整个库设置为 readonly之后,如果客户端发生异常,则数据库就会一直保持readonly状态,这样会导致整个 库长时间处于不可写状态,风险较高。
表级锁
MySQL里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)。
表锁的语法是
lock tables …read/write。与FTWRL类似,可以用unlock tables主动释放锁, 也可以在客户端断开的时候自动释放。lock tables语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象。对于InnoDB这种支持行锁的引擎,一般不使用lock tables命令来控制并发,毕竟锁住整个表的影响面还是太大 。
元数据锁 MDL不需要显式使用,在访问一个表的时候会被自动加上。
(1)读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。
(2)读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。
- 事务中的元数据锁 (MDL锁),在语句执行开始时申请,但是语句结束后并不会马上释 放,而会等到整个事务提交后再释放。
问题 :如何安全地给小表加字段?
(1) 首先要解决长事务,事务不提交,就会一直占着MDL锁。 如果你要做DDL变更的表刚好有长事务 在执行,要考虑先暂停DDL,或者kill掉这个长事务 。
(2) 如果你要变更的表是一个热点表, 请求很频繁,这时候kill可能未必管用, 比较理想的机制是,在alter table语句里面 设定等待时间,如果在这个指定的等待时间里面能够拿到MDL写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后开发人员或者DBA再通过重试命令重复这个过程。
小结
介绍了MySQL的全局锁和表级锁。
全局锁主要用在逻辑备份过程中。
表锁一般是在数据库引擎不支持行锁的时候才会被用到的。
元数据锁(MDL)会直到事务提交才释放。
边栏推荐
- Famous handwritten note taking software recruit CTO · coordinate Shenzhen
- MySQL table operation
- Easy entry natural language processing series 12 hidden Markov models
- Numpy basic package for data analysis
- ~4.1 sword finger offer 05. replace spaces
- ~4.2 CCF 2021-12-1 sequence query
- 应用实践:Paddle分类模型大集成者[PaddleHub、Finetune、prompt]
- Opencv video tracking "suggestions collection"
- ~5 new solution of CCF 2021-12-2 sequence query
- Thymeleaf controls whether display is displayed through style
猜你喜欢

PS making and loading GIF pictures tutorial

Products on Apple's official website can save 600 yuan by buying iPhone 13 Pro max at a discount

Keys and scan based on redis delete keys with TTL -1

Teach you how to apply for SSL certificate

关于ROS2安装connext RMW的进度条卡在13%问题的解决办法

SSM framework integration, simple case

Matplotlib data visualization three minutes entry, half an hour enchanted?

Alibaba cloud installs mysql5.7

Mongodb source code deployment and configuration

~4.2 CCF 2021-12-1 sequence query
随机推荐
jqgrid全选取消单行点击取消事件
idea正则表达式替换(idea正则搜索)
Xintang nuc980 set DHCP or static IP
Typora cannot open the prompt to install a new version solution
Why do China Construction and China Railway need this certificate? What is the reason?
swiper 一侧或两侧露出一小部分
From fish eye to look around to multi task King bombing -- a review of Valeo's classic articles on visual depth estimation (from fisheyedistancenet to omnidet) (Part 2)
pytorch训练代码编写技巧、DataLoader、爱因斯坦标示
Teach you how to apply for SSL certificate
Paddlenlp之UIE关系抽取模型【高管关系抽取为例】
网络安全应急响应技术实战指南(奇安信)
Famous handwritten note taking software recruit CTO · coordinate Shenzhen
opencv视频跟踪「建议收藏」
Typora无法打开提示安装新版本解决办法
国联证券买股票开户安全吗?
元器件采购系统的主要功能,数字化采购助力元器件企业飞速发展
Runtimeerror: CUDA out of memory (solved) [easy to understand]
手把手教你申请SSL证书
Matplotlib data visualization three minutes entry, half an hour enchanted?
Mysql表的操作