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写锁最好,拿不到也不影响后续业务语句,先放弃,可以再重试命令获取。
总结
理解锁的概念,分类和用途