粒度:
数据仓库中数据的细化或综合程度的级别
锁的种类(按粒度分):
全局锁:
锁定数据库中的所有表。
表级锁:
每次操作锁住整张表。
行级锁:
每次操作锁住对应的行数据。
全局锁:
是对整个数据库实例加锁,加锁后只能进行读(DQL)操作,除此之外的语句都会被阻塞。
使用场景:做全库备份时为了保持数据一致性而加全局锁。
语法:
加全局锁
flush tables with read lock ;
数据备份:
方法一:
mysqldump -uroot –p1234 wecunge > wecunge.sql;
方法二(推荐):
mysqldump --single-transaction -uroot –p123456 wecunge > wecunge.sql
方法一在主库备份时因为全局锁业务无法进行,在从库备份时因无法执行主从同步过来的二进制日志导致主从延迟。
方法二可以完成不加锁的一致性数据备份。
表级锁:
表锁:
表共享读锁(read lock):
加了表共享读锁后,所有客户端只能对表进行读(DQL)操作,会阻塞其他客户端的写操作(DDL/DML)。
表独占写锁(write lock):
加了表独占写锁后,当前客户端可以进行读写操作,会阻塞其他客户端的读写操作。
语法:
加锁:
lock tables 表名 read/write;
解锁:
unlock tables;
元数据锁:
元数据锁在访问表时会自动加上无需显式调用。
当在表上有活动事务的时候,为了避免DML与 DDL冲突,保证读写的正确性,不可以对元数据(表结构)进行写入操作。
意向锁:
意向锁可以使表锁不用检查每行 数据是否加锁,使用意向锁来减少表锁的检查。
如果未添加意向锁,为了避免修改操作时行锁与表锁冲突,添加表锁时会检查当前表是否有对应的行锁,如果没有,则添加表锁,此时就会从第一行数据,检查到最后一行数据,效率较低。
不同情况,所添加的锁:
EXCLUSIVE(排他锁X):
一般在执行DDL时会产生该锁。
SHARED_NO_READ_WRITE(排他锁X):
执行lock tables xxx write产生该锁。
SHARED_WRITE(意向排他锁IX):
一般执行DML的更新语句 或 select ... for update产生该锁。
SHARED_READ(意向共享锁IS):
select ... lock in share mode/select...for share产生该锁
SHARED_READ_ONLY(共享锁S):
执行lock tables xxx read产生该锁
查看加锁情况:
语法:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from
performance_schema.data_locks;
行级锁:
行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。
行锁(Record Lock):
锁定单个行记录的锁,防止其他事务对此行进行update和delete。在 RC、RR隔离级别下都支持。
INSERT:
排他锁,自动加锁 。
UPDATE:
排他锁 ,自动加锁 。
DELETE:
SELECT:
不加任何锁。
SELECT ... LOCK IN SHAREMODE:
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排它锁。
SELECT ... FOR UPDATE:
排他锁(X):允许获取排他锁的事务更新数据,阻止其他事务获得相同数据集的共享锁和排他锁。
注:共享锁和共享锁兼容,和互斥锁互不兼容,互斥锁和互斥锁不兼容。
间隙锁(Gap Lock):
锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事 务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。
临键锁(Next-Key Lock):