一、锁的介绍
锁是计算机协调多个进程或者线程并发访问某一资源的机制。那么如何保证数据并发访问的一致性、有效性是数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,所以数据库中锁的应用极为重要,其复杂度也更高。
锁的分类,以锁的颗粒度为三类:
全局锁:锁定数据库中的所有表。
表级锁:每次操作锁住整张表。
行级锁:每次操作都锁到对应行的数据。
接下来就分别对这几种锁做一个解释。
二、全局锁
1、概念
对整个数据库实例加锁,加锁后整个实例就处于只读状态,对于后面的DML语句,DDL语句,已经更新操作的事务提交语句都会被阻塞。
典型的场景应用:数据备份。对所有的表进行锁定,从而获取数据的一致性,保证数据的完整性。
如图所示,我们加了全局锁之后,使用mysqldump取备份数据的时候,其他客户端的事务是不能执行DML操作、DDL操作的,但可以执行DQL操作,当我们备份好数据后,导出xxx.sql文件后,再解开锁,此时DML操作、DDL操作才生效。
(其中DML操作是指:对数据进行增加、删除、修改操作。DDL操作是指:主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。DQL操作是指:对数据进行查询操作。还有DCL操作是指:主要是用来设置/更改数据库用户权限。)
2、语句
加锁:flush tables with read lock;
解锁:unlock table
3、不足
①:如果在主库上备份,那么备份期间都不能执行更新,业务基本上就停摆了 。
②:如果在从库上备份,那么在备份期间不能执行同步过来的二进制日志洗,会导致延迟。
二、表级锁
对于表级锁,锁定粒度答,发生锁冲突的概率 最高,并发度低。应用在MyISAM、InnoDB、BDB等存储引擎中。
表级锁分为表锁、元数据锁、意向锁三类。
1、表锁
(1)表共享读锁(read lock)
如图所示有两个客户端Client1、Client2当Client1执行加锁操作后,Client1、Client2都只能执行DQL