锁
在 MySQL 里,根据加锁的范围,可以分为全局锁、表锁和行锁三类。
全局锁
全局锁也就是对整个数据库加锁
什么时候使用全局锁?
全局锁主要应用于做全库逻辑备份,这样在备份数据库期间,不会因为数据或表结构的更新,而出现备份文件的数据与预期的不一样。
全局锁是怎么用的?
flush tables with read lock;
执行这条命令后,整个数据库就处于只读状态了
怎么释放全局锁?
unlock tables;
加全局锁有什么缺点?
加了全局锁之后,整个数据库都是只读状态,如果数据库里有很多数据,备份就会花费很多的时间,关键是备份期间,业务只能读数据,而不能更新数据,这样会造成业务停滞。
怎么解决?
如果数据库的引擎支持的事务支持可重复读的隔离级别,那么在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。
表锁
表锁也就是对某张表加锁
什么时候用表锁?
当需要更新表中的大量行时,可以加表锁,以减少数据库的内部管理操作,提高效率
读锁:当前会话和其它会话都可以读表ÿ