sql_lock

    1. 全局锁
    2. 表级锁
    3. 行级锁

全局锁

对整个数据库加锁,之后整个实例处于只读状态,后续的dml的写语句,ddl语句,已经更新操作的事务提交语句都将被阻塞。

典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

特点:

​ 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。

​ 如果从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟。

在innodb引擎中,我们可以在备份时加上参数–single-transaction参数来完成不加锁的一致性数据备份

mysqldump --single-transaction -uroot -p123456 itcase>itcast.sql

表级锁

每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在mylsam,innodb,bdb等存储引擎中。

对于表级锁,主要分为以下三类:

表锁

​ 表共享读锁(read lock)

​ 表独占写锁 (write lock)

元数据锁(mdl)

系统 自动控制,无需显式使用。主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作。为了避免dml和ddl冲突,保证读写的正确性。

在mysql5.5中引入了mdl,对一张表进行增删改查的时候,加mdl读锁(共享);当对表结构进行变更操作的时候,加mdl写锁(排他)。

意向锁

​ 意向共享锁(IS):由语句select…lock in share mode添加

​ 意向排他锁(IX):由insert,update,delete,select…for update添加

行级锁

每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在innodb中。

innodb的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:

​ 行锁:锁住单行记录的锁,防止其他事务对此行进行update和delete,在rc,rr隔离级别下都支持

​ 共享锁(S),排他锁(X)

​ 间隙锁:锁定索引记录间隙(不包含改记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在rr隔离级别下都支持。vb

​ 临键锁:行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙gap,在rr隔离级别下支持。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。