MySQL的锁
锁
概述:锁是计算机协调多个线程或进程并发访问某一资源的机制。如何保证数据库中并发的一致性,有效性,这就是锁的作用。
分类:
-
全局锁
-
对数据库实例加锁,加锁之后,处于只读状态,后续的DML语句以及更新操作的事务提交语句都将阻塞。
-
典型的业务场景就是全库的逻辑备份,对所有的表进行锁定,获取一致性视图,保证数据的完整性。
-
flush tables with read lock; 加全局锁 mysqldump -h(远程端口号) -uroot -p1234 data > /路径 mysqldump为mysql自带的工具直接在命令行当中执行 unlock tables; 释放锁 在InnoDB引擎当中,不用加全局锁也能够进行数据备份。 mysqldump --sigin-trabsaction -h(远程端口号) -uroot -p1234 data > /路径
-
-
如果在从库上备份,那么备份期间从库不能执行主库同步过来的二进制日志,会导致主从延迟
-
-
表级锁
-
表锁:
-
表共享读锁:read lock当加上之后只能够进行读操作,待到锁释放之后才能够正常写。
-
表独占写锁:write lock当某对话框进行加锁之后,只能够使加锁的一方进行读写操作,其他客户端不允许读和写。
读锁不会阻塞其他客户端的读,但是会阻塞写,写锁会阻塞其他客户端的读,又会阻塞其他客户端的写。
-
-
元数据锁:元数据锁是系统自动控制的,无需显式使用,在访问一张表的时候,会自动加上,元数据锁在活动事务的时候,不可以对元数据进行写入操作,为了避免DML与DDL冲突,保证读写的正确性。在对一张表进行和增删改查的时候,加MDL读锁,当对表结构进行变更操作的时候,加MDL写锁(非他)。
我们可以根据
select object type,object _schema,object name,lock type,lock duration from performance_schema.metadata locks ;进行元数据锁的查看。
意向锁:为了解决多线程并发的状态下出现表锁以及行锁引发的冲突,我们就可以使用意向锁。
-
意向共享锁(IS):执行select 语句的时候添加。
-
与表锁共享锁(read)兼容,与表锁排它锁(write)互斥
-
-
意向排他锁(IX):执行insert,update,delete,select...for update语句的时候添加。
-
与表锁共享锁以及排它锁都互斥,意向锁之间不会互斥。
-
select object schema,object name,index name,lock type,lock mode,lock data from performance schema.data locks; 查看意向锁及行锁的加锁情况。
-
-
-
-
行级锁
-
每次操作的时候,锁住对应的行数据 ,发生锁冲突的概率最低,并发度最高。在InnoDB引擎当中的数据是基于索引组织的,行锁是通过对索引加锁来实现的,而不是对记录加的锁。
-
行锁:锁定单个行记录的所,防止其他事务对此行进行update和delete。在RC和RR隔离级别下都支持。
-
RC隔离(Read Committed):在该隔离下,一个事务只能读取其他事务已经提交的数据。
-
RR隔离(Repeatable Read):一个事务在整个事务期间看到的数据都是一致的。
-
共享锁:允许一个事务去读一行,组织其他事物获取相同数据集的排它锁。
-
排他锁:云趣获取排他锁的事务更新数据,组织其他事务获得相同数据集的共享锁和排他锁。当数据当中的条件没有索引的时候,那么就会给表中的所有行都进行加锁,也就是表锁。
-
-
间隙锁:锁定索引记录间隙,确保索引记录间隙不变,防止其他事务在此间隙进行insert插入,防止幻读。在RR隔离级别下都支持。
-
索引上的等值查询(唯一索引),给不存在的记录加锁时,优化为间隙锁
-
索引上的等值查询(普通索引),向右遍历时最后一个值不满足查询需求时,next-key lock退化为间隙锁。
-
间隙锁,唯一的目的就是防止其他事务插入间隙,间隙锁可以共存,一个事务采用的间隙锁不会组织另一个事物在同一间间隙上采用间隙锁。
-
-
-
临键锁:行锁和;间隙锁的组合,同时锁住数据,并锁住数据前面的间隙Gap在RR隔离级别下支持。
-
索引上的范围查询(唯一索引),会访问到部门,按组条件的第一个值为止。
-
-