MySQL实战06の锁

 

1. 锁的用处?

MySQL的锁就是为了处理并发问题

 

2. 锁的分类

全局锁:对整个数据库实例加锁。
加全局锁命令:Flush tables with read lock;(FTWRL) 
加全局锁后,数据更新语句,数据定义语句和更新类事务语句都会被阻塞。
适用场景:做全库逻辑备份,就是把每个表selsct出来存成文本。

备份为什么加全局锁?不加锁会有什么问题?
假设维护极客时间的购买系统,关注用户的账户余额和用户课表。
备份系统备份得到的库不是一个逻辑时间点,这个视图是逻辑不一致的(
拿到一致性视图,我们需要事务
MySQL自带的备份工具是mysqldump,使用参数-single-transaction,导库会启动一个事务来确保拿到一致性视图。
这个方法只适用于所有的表使用事务引擎的库,MyISAM不支持事务,是需要
FTWRL命令加锁
既然全库只读,使用set global readonly=true的方式呢?
(1)有些系统用readonly用作其它逻辑,比如判断是主从库
(2)异常处理上的差异。
使用FTWRL命令,客户端异常MySQL会自动释放这个全局锁整个库可恢复正常更新状态;
若使用readonly,客户端异常数据库会一直保持readonly状态,整个库长时间不可写,风险较高。
表级锁
表锁
lock tables ...read/write
InnoDB支持更细粒度的行锁,一般不使用表锁命令。

元数据锁
不需要显示使用,在访问一个表的时候会被自动加上,保证读写的正确性。
(1)读锁之间不互斥,多个线程可同时对一张表的数据进行增删改查。
(2)读写锁之间,写锁之间是互斥的,保证变更表结构操作的安全性。

如何安全的给小表加字段?
在alter table 语句里面设定等待时间,在等待时间内拿到MDL写锁最好,拿不到也不影响后续业务语句,先放弃,可以再重试命令获取。

 

总结

理解锁的概念,分类和用途

原文地址:https://time.geekbang.org/column/article/69862

posted @ 2018-12-25 10:53  华格瑞沙  阅读(137)  评论(0编辑  收藏  举报