MYSQL-锁

全局锁
flush tables with read lock;

mysqldump -uroot -p1234 itcast>itcast.sql(换成自己的用户名与密码)

unlock tables;

特点
数据库中加全局锁,是一一个比较重的操作,存在以下问题:

  1. 如果在主库上备份,那么在备份期间都不能执行更新,业务基本.上就得停摆。
  2. 如果在从库 上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog) ,会导致主从延迟。

在InnoDB引擎中,我们可以在备份时加上参数–single-transaction参数来完成不加锁的-致性数据备份。
mysqldump --single-transaction -uroot -p123456 itcast>itcast.sql

–single-transaction 在事务开启的瞬间,InnoDB 会为该事务分配一个事务 ID,这个事务 ID 代表了一个特定的时间点,备份操作将基于这个时间点来获取数据。

表级锁
表锁

读锁read lock:当前客户端可以读写,其他客户端只能读不能写(会阻塞)。

写锁write lock:当前客户端可以读写,其他客户端不能读不能写。

加锁: lock tables表名…read/write。

释放锁: unlock tables / 客户端断开连接。

元数据锁( meta data lock,MDL)

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

对应SQL锁类型说明
lock tables xxx read / writeSHARED_READ_ONLY / SHARED NO_READ_WRITE
select、select … lock in share modeSHARED_READ(共享读锁)与SHARED_READ、SHARED WRITE兼容,与EXCLUSIVE互斥
insert、update、 delete、 select … for updateSHARED_WRITE与SHARED_READ、SHARED_WRITE兼容 ,与EXCLUSIVE互斥
alter table …EXCLUSIVE(排他锁)与其他的MDL都互斥

alter table 的操作自动加上exclude lock排他锁,与读锁read lock、写锁write lock互斥,当有select(read lock)、update(write lock)等加入了读、写锁时,进行alter table操作会阻塞。

意向锁

为了避免DML在执行时,加的行锁与表锁的冲突,在InnoDB中引入了意向锁,使得表锁不用检查每行数据是否加锁,使用意向锁来减少表锁的检查

解释:当有操作加了行锁时,此时又有加表锁的操作,会先扫描整个表看有没有其他兼容的锁,不兼容则等待释放,可以在加行锁时加一个意向锁,这样,每次加表锁时先检查意向锁是否存在,兼容,不用扫描整个表。

  1. 意向共享锁(IS):由语句select … lock in share mode添加。
  2. 意向排他锁 (IX):由insert、 update、delete、 select … for update添加。
行级锁

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

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

  1. 行锁(Record Lock) :锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。

    SQL行锁类型说明
    INSERT …排他锁自动加锁
    UPDATE …排他锁自动加锁
    DELETE …排他锁自动加锁

    select操作是共享锁,此时只有设置共享锁的语句可以兼容,而其他INSERT等操作为排它锁,所有操作都不能执行

    (1) 针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。
    (2) InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据(检索的列没有加索引),那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁

  2. 间隙锁(Gap Lock) :锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。

  3. 临键锁(Next-Key Lock) :行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值