提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
MySQL最开始添加锁是为了处理各种并发场景,但是有些锁的范围较广,不能很好的契合实际的开发需求,因此锁的粒度在不断减小,但是可用性是不断提升,合理的分配锁可以实现高效率访问数据资源,因此MySQL也就衍生出了各种锁。本文参考《MySQL实战45讲》,仅作学习。
一、全局锁
全局锁明面上就是为整个数据库都添加一个锁,最常见的就是当需要对数据库进行全局备份的时候需要去添加一个全局读锁:flush tables with read lock(FTWRL);加锁后DDL和DML操作都会被阻塞,同时事务也无法进行提交。
理论上当我们需要全局备份的时候使用事务(single-transaction)也可以实现的,因为在可重复读的隔离级别下会对当时的库数据打一个快照,可以保证数据一致性。但并不是所有的引擎都有事务的,如MyISAM就不支持事务,也就只能使用加全局读锁去备份。
还有一种方法是设置全局只读:set global readonly=true,但是这种方法有一个很大的弊端:如果使用FTWRL,当数据库发生连接断开时,这个全局读锁会被自动释放,而将库设置为readonly后断开连接后数据库会依然保持readonly,致使数据库长时间处于不可写的情况,可能会影响公司的业务。