MySQLmysql的各种锁介绍

Posted 盖丽男

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQLmysql的各种锁介绍相关的知识,希望对你有一定的参考价值。

全局锁

全局锁就是将整个mysql置为只读状态,后续的MDL的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。
命令:
加锁: Flush tables with read lock (FTWRL)。
解锁;unlock tables;

表级锁

表级锁是控制某个表的只读,可读可写
加锁: lock tables … read/write。

MDL(metadata lock)锁

还有mysql会自己加的 MDL(metadata lock)锁,元数据锁,当对一个表做增删改查操作的时候,加 MDL读锁;当要对表做结构变更操作的时候,加 MDL 写锁
读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。
读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。因此,如果有两个线程要同时给一个表加字段,其中一个要等另一个执行完才能开始执行。

意向锁(Intention Locks)

意向锁是有数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享 / 排他锁之前,InooDB 会先获取该数据行所在在数据表的对应意向锁。
意向锁的存在是为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。

自增锁(Auto-inc Locks)

自增锁是一种特殊的表级别锁(table-level lock),专门针对事务插入AUTO_INCREMENT类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行,是连续的主键值。

行级锁

共享/排它锁(Shared and Exclusive Locks)

INNODB的行级锁有共享锁(S LOCK)和排他锁(X LOCK)两种。共享锁允许事物读一行记录,不允许任何线程对该行记录进行修改。排他锁允许当前事物删除或更新一行记录,其他线程不能操作该记录。
1)意向共享锁(IS锁):事务在请求S锁前,要先获得IS锁
2)意向排他锁(IX锁):事务在请求X锁前,要先获得IX锁

共享锁:

用法:SELECT … LOCK IN SHARE MODE;

共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

MySQL会对查询结果集中每行都添加共享锁。

锁申请前提:当前没有线程对该结果集中的任何行使用排他锁,否则申请会阻塞。

排它锁

用法: SELECT … FOR UPDATE;

排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

MySQL会对查询结果集中每行都添加排他锁,在事物操作中,任何对记录的更新与删除操作会自动加上排他锁。

锁申请前提:当前没有线程对该结果集中的任何行使用排他锁或共享锁,否则申请会阻塞。

间隙锁(Gap Locks)

锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。
当执行 select * from t where d=5 for update 的时候,不仅仅加了行锁,还加了间隙锁。
与间隙锁存在冲突关系的,是“往这个间隙中插入一个记录”这个操作。间隙锁之间都不存在冲突关系。

临键锁(Next-key Locks)

行锁与间隙锁组合起来用就叫做Next-Key Lock。

插入意向锁(Insert Intention Locks)

插入意向锁是一种Gap锁,不是意向锁,这种锁表示要以这样一种方式插入:如果多个事务插入到相同的索引间隙中,如果它们不在间隙中的相同位置插入,则无需等待其他事务。
比如说有索引记录4和7,有两个事务想要分别插入5,6,在获取插入行上的独占锁之前,每个锁都使用插入意图锁锁定4和7之间的间隙,但是不要互相阻塞,因为行是不冲突的,意向锁的涉及是为了插入的正确和高效。

以上是关于MySQLmysql的各种锁介绍的主要内容,如果未能解决你的问题,请参考以下文章

Mysqlmysql乐观锁总结和实践

Mysqlmysql乐观锁总结和实践

Java并发编程:并发编程基础各种锁详细介绍

java中的各种锁详细介绍

java中的各种锁详细介绍

史上最全 Java 中各种锁的介绍